树的遍历详解

目录

树的静态写法

树的先根遍历

树的层次遍历

从树的遍历看DFS和BFS

DFS与先根遍历

BFS与层次遍历

树的静态写法

这里讨论的树是一般意义上的树,即子结点个数不限且子节点没有先后次序的树。

建议使用静态写法进行结点的定义

struct node{
	typename data;
	int child[maxn];。。存放所有子节点的下标
}Node[maxn];

在上面的定义中由于无法预知子结点个数,因此child数组的长度只能开到最大,而这对一些结点个数较多的题目来说显然是不可接受的,因此需要使用STL中的vector,即长度根据实际需要而自动变化的数组。

struct node{
	typename data;
	vector child;
}Node[maxn];

当需要新建一个结点时,就按顺序从数组中取出一个下标即可。

int index=0;
int newNode(int v){
	Node[index].data=v;
	Node[index].child.clear();
	return index++;
}

树的先根遍历

树的先根遍历即总是先访问根节点,再去访问所有子树,递归访问。

void preorder(int root){
	printf("%d ",Node[root].data);
	for(int i=0;i<Node[root].child.size();i++){
		preorder(Node[root].child[i]);
	}
}

树的层次遍历

树的层次遍历总是从树根开始,一层一层地向下遍历。

void Layerorder(int root){
	queue<int> Q;
	Q.push(root);
	while(!Q.empty()){
		int front=Q.front();
		printf("%d ",Node[front].data);
		Q.pop();
		for(int i=0;i<Node[front].child.size();i++){
			Q.push(Node[front].child[i]);
		}
	}
}

同样地,如果需要对结点的层号进行求解,只需要在结构体node的定义中增加变量来记录结点的层号:

struct node{
	int layer;
	int data;
	vector<int>child;
};

于是树的层次遍历就可以写成下面这样:

void Layerorder(int root){
	queue<int> Q;
	Q.push(root);
	Node[root].layer=0;//记录根结点的层号为0 
	while(!Q.empty()){
		int front=Q.front();
		printf("%d ",Node[front].data);
		Q.pop();
		for(int i=0;i<Node[front].child.size();i++){
			int child=Node[front].child[i];
			Node[child].layer=Node[front].layer+1;
			Q.push(child);
		}
	}
}

从树的遍历看DFS和BFS

DFS与先根遍历

例如当使用深度优先遍历搜索迷宫时,从入口出发,经过一系列岔道口和死胡同,最终找到了出口。事实上,可以把岔道口和死胡同都当作结点,并将它们的连接关系表示出来。

事实上所有合法的DFS求解过程,都可以把它画成树的形式,此时死胡同等价于树中的叶子结点,而岔道口等价于树中的非叶子节点,并且对这棵树的DFS遍历过程就是树的先根遍历的过程。

于是可以得到一些启发:碰到一些可以用DFS做的题目,不妨把一些状态作为树的结点,然后问题就会转换为直观的对树进行先根遍历的问题。如果想要得到树的某些信息,也可以借用DFS以深度作为第一关键词的思想来对结点进行遍历,以获得所需的结果。

BFS与层次遍历

在使用BFS模拟迷宫问题的过程中,依然将迷宫的岔道口和死胡同都简化为结点,将迷宫的结构转换为树。对所有合法的BFS求解过程,都可以转换为树的层次遍历的问题。

例题

给定一棵树和每个结点的权值,求所有从根节点到叶子节点的路径,使得每条路径上的结点的权值之和等于给定的常数S。如果有多条这样的路径,则按路径递增的顺序输出。其中路径的大小是指,如果两条路径的前几项都相等,遇到不等时,若a_{i}>b_{i},那么称第一条路径比第二条路径大。

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=110;
struct node{
	int weigh;
	vector<int> child;
}Node[maxn];
bool cmp(int a,int b){
	return Node[a].weigh>Node[b].weigh;
}
int n,m,S;//结点数,边数,给定的和 
int path[maxn];
//当前访问结点数index,numNode为当前路径path上的结点个数 
void dfs(int index,int numNode,int sum){
	if(sum>S){
		return;
	}
	if(sum==S){
		if(Node[index].child.size()!=0){
			return;
		}
		for(int i=0;i<numNode;i++){
			printf("%d",Node[path[i]].weigh);
			if(i<numNode-1){
				printf(" ");
			}
			else{
				printf("\n");
			}
		}
		return;
	}
	for(int i=0;i<Node[index].child.size();i++){
		int child=Node[index].child[i];
		path[numNode]=child;
		dfs(child,numNode+1,sum+Node[child].weigh);
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&S);
	for(int i=0;i<n;i++){
		scanf("%d",&Node[i].weigh);
	}
	int id,k,child;
	for(int i=0;i<m;i++){
		scanf("%d%d",&id,&k);//结点编号,孩子个数 
		for(int j=0;j<k;j++){
			scanf("%d",&child);
			Node[id].child.push_back(child);
		}
		sort(Node[id].child.begin(),Node[id].child.end(),cmp);
	}
	path[0]=0;
	dfs(0,1,Node[0].weigh);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…

Mac - Node/Java 配置安装全流程

Mac - Node/Java 配置安装全流程 一. Git 安装二. Java 相关安装2.1 jenv 版本控制工具2.2 JDK1.8 和 JDK21的安装2.3 maven 安装 三. Node 相关安装3.1 nvm 版本控制工具3.2 Node 版本安装 一. Git 安装 1.我们首先安装一下Homebrew&#xff0c;这个工具很有用&#xff0c;能…

Spring Security系列之PasswordEncoder

概述 任何一个登录系统的密码不能明文存储&#xff0c;万一发生数据库泄漏事故&#xff08;不管是内部人员导出数据库数据还是被黑客攻击破解数据库实例节点拿到数据库数据等&#xff0c;又或者是其他情况造成的&#xff09;&#xff0c;将产生巨大的损失。因此明文密码在存储…

react-学习基础偏

1.新建文件夹 2.vscode引入这个文件夹 3.打开vscode终端 执行命令 npx create-react-app react-basic 创建基本项目&#xff08;react-basic项目文件夹名&#xff09; 4.进入到这个文件夹 可用的一些命令 这就算启动成功 5. 这是项目的核心包 渲染流程

关于JavaScript技术的基础内容汇总

目录 JavaScript 基础知识1. JavaScript 基本语法2. 变量和常量3. 数据类型4. 运算符5. 控制结构6. 函数7. 对象8. 数组9. 事件处理10. DOM 操作 JavaScript 基础知识 学习 JavaScript&#xff08;简称 JS&#xff09;是前端开发的重要组成部分&#xff0c;它是一种动态的、弱…

【c语言】指针就该这么学(3)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 一、函数指针 1.函数指针变量的创建 2.函数指针变量的使用 二、typedef关键字 三、函数指针数组 1.函数指针数组的概念 2.函数指针数…

【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)

目录 一、 进程1.1 PID(进程标识符)1.2 内存指针1.3 文件描述符表1.4 状态1.5 优先级1.6 记账信息1.7 上下文 二、线程三、总结&#xff1a;进程和线程之间的区别&#xff08;非常非常非常重要&#xff0c;面试必考题&#xff09; 一、 进程 简单来介绍一下什么是进程&#xf…

[UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明

本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor 并添加一个 DT Runtime Fbx Component。 然后直接调用组件的函数 LoadFile 加载显示模型&#xff08;注&#xff1a;不支持模型动画&#xff09; FilePath : 加载模型的绝对路径。 Create Collision : 是否创建碰撞…

R语言探索与分析19-CPI的分析和研究

一、选题背景 CPI&#xff08;居民消费价格指数&#xff09;作为一个重要的宏观经济指标&#xff0c;扮演着评估通货膨胀和居民生活水平的关键角色。在湖北省这个经济活跃的地区&#xff0c;CPI的波动对于居民生活、企业经营以及政府宏观经济政策制定都具有重要的影响。因此&a…

单链表的排序

对一个单链表进行排序。 方法一&#xff1a;构造一个辅助的数组来排序。 Java构造一个集合来存储。先将链表内容存储到集合中去&#xff0c;再对集合进行排序&#xff0c;最后按照顺序取出集合中的数据即可。 public ListNode sortInLit(ListNode head) {if (head null || he…

Solon2分布式事件总线的应用价值探讨

随着现代软件系统的复杂性日益增加&#xff0c;微服务架构逐渐成为开发大型应用的主流选择。在这种架构下&#xff0c;服务之间的通信和协同变得至关重要。Solon2作为一个高性能的Java微服务框架&#xff0c;其分布式事件总线&#xff08;Distributed Event Bus&#xff09;为微…

国标GB/T 28181详解:国标GBT28181-2022的客户端主动发起历史视音频回放流程

目录 一、定义 二、作用 1、提供有效的数据回顾机制 2、增强监控系统的功能性 3、保障数据传输与存储的可靠性 4、实现精细化的操作与控制 5、促进监控系统的集成与发展 三、历史视音频回放的基本要求 四、命令流程 1、流程图 2、流程描述 五、协议接口 1、会话控…

网络空间安全数学基础·多项式环与有限域

5.1 多项式环&#xff08;掌握&#xff09; 5.2 多项式剩余类环&#xff08;理解&#xff09; 5.3 有限域&#xff08;熟练&#xff09; 5.1 多项式环 定义&#xff1a;设F是一个域&#xff0c;称是F上的一元多项式&#xff0e; 首项&#xff1a;如果an≠0&#xff0c;则称 a…

el-dialog给弹框标题后加图标,鼠标悬停显示详细内容

效果&#xff1a; 代码&#xff1a; <div slot"title" class"el-dialog__title">标题<el-tooltip effect"dark" placement"right"><div slot"content">鼠标悬停显示</div><i class"el-icon…

队列的讲解与实现

这里写目录标题 一、队列的概念及结构二、队列的实现(使用VS2022的C语言)1.初始化、销毁2.入队、出队3.返回队头元素、返回队尾元素、判空、返回有效元素个数 三、完整 Queue.c 源代码 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

手机相册的排列方式探讨

不论你是不是程序员&#xff0c;你一定留意过一个问题&#xff1a;相册 App 基本都将图片裁剪成了居中的 1:1 正方形。那么手机相册 App&#xff0c;为什么要将图片切割成 1:1 正方形&#xff0c;然后以网格排列&#xff1f;是行业标准吗&#xff1f; 自适应图片宽度的图库&a…

vr样板房实景漫游展示制作解决了地产商难题

家具和软装销售中&#xff0c;如何直观展示产品优势一直是老板们的难题。口头描述往往难以让客户真正感受到产品的独特之处&#xff0c;这不仅影响了销售效果&#xff0c;也增加了沟通的难度。但现在&#xff0c;我们有了全新的解决方案——样板房VR全景编辑软件! 样板房VR全景…

SpringMVC:消息转换器

1. HttpMessageConvertor 简介 HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 转换器 如上图所示&#xff1a;HttpMessageConverter接口的可以将请求协议转…

数据结构之ArrayList与顺序表(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 顺序表的学习&#xff0c;点我 上面这篇博文是关于顺序表的基础知识&#xff0c;以及顺序表的实现。…

美团面试:百亿级分片,如何设计基因算法?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类的场景题&#xff1a; 1.说说分库分表的基因算法&#xff1f…