树的遍历详解

news2024/11/17 8:16:20

目录

树的静态写法

树的先根遍历

树的层次遍历

从树的遍历看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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UI框架与MVC模式详解(1)——逻辑与数据分离

【效率最高的耦合方式】 以实际的例子来说明&#xff0c;更容易理解些。 这里从上到下&#xff0c;从左到右共有8个显示项&#xff0c;如果只需要显示这8个&#xff0c;不会做任何改变&#xff0c;数据固定&#xff0c;那么我们只需要最常规的思路去写就好&#xff0c;这是最…

antdv 穿梭框

antd的穿梭框的数据貌似只接收key和title&#xff0c;而且必须是字符串&#xff08;我测试不是字符串的不行&#xff09;&#xff0c; 所以要把后端返回的数据再处理一下得到我们想要的数据 除了实现简单的穿梭框功能&#xff0c;还想要重写搜索事件&#xff0c;想达到的效果是…

时间序列新范式!多尺度+时间序列,刷爆多项SOTA

当我们面对复杂模式和多变周期的应用场景&#xff08;比如金融市场分析&#xff09;时&#xff0c;采用多尺度时间序列来做分析和预测是个更好的选择。 这是因为&#xff1a;传统时序方法通常只用固定时间窗口来提取信息&#xff0c;难以适应不同时间尺度上的模式变化。但多尺…

opencv实战小结-银行卡号识别

实战1-银行卡号识别 项目来源&#xff1a;opencv入门 项目目的&#xff1a;识别传入的银行卡照片中的卡号 难点&#xff1a;银行卡上会有一些干扰项&#xff0c;如何排除这些干扰项&#xff0c;并且打印正确的号码是一个问题 最终效果如上图 实现这样的功能需要以下几个步骤…

蓝桥云课第12届强者挑战赛

第一题&#xff1a;字符串加法 其实本质上就是一个高精度问题&#xff0c;可以使用同余定理的推论 &#xff08;ab&#xff09;%n((a%n)(b%n))%n; #include <iostream> using namespace std; const int mod1e97; int main() {string a,b;cin>>a>>b;ab;int …

GAN网络理论和实验(二)

文章目录 一、说明二、什么是生成对抗网络&#xff1f;三、判别模型与生成模型四、生成对抗网络的架构五、你的第一个 GAN六、准备训练数据七、实现鉴别器八、实现生成器九、训练模型十、检查 GAN 生成的样本十一、使用 GAN 生成手写数字十二、准备训练数据十三、实现鉴别器和生…

LabVIEW减压阀和温控阀综合测试系统

在使用LabVIEW开发阀门测试软件时&#xff0c;特别是针对减压阀和温控阀&#xff0c;测试内容和注意事项包括以下方面&#xff1a; 测试内容 压力测试&#xff1a; 入口压力&#xff1a;测量阀门在不同入口压力下的表现。 出口压力&#xff1a;确保减压阀能够将出口压力控制在…

【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?

环境&#xff1a; VS 2019Windows10本地版本管理&#xff08;非远程&#xff09; 前言&#xff1a; git 在Visual Stadio 2019中集成了git的版本管理&#xff0c;在本地用来做版本管理&#xff0c;本来比较好用。 不过有一次&#xff0c;由于拿最初始的版本的时候&#xf…

代驾公司在市场竞争中如何保持优势?

在竞争激烈的市场中&#xff0c;代驾公司可以通过多种策略保持其竞争优势&#xff0c;包括利用市场潜力、创新服务模式、提高服务效率以及加强品牌建设等。以下是具体的策略&#xff1a; 利用市场潜力 汽车产业空间巨大&#xff1a;随着汽车保有量的增加&#xff0c;代驾行业…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

Intel VT-x怎么开启?如何解决VMware打开虚拟机报错问题?

许多小伙伴在安装完VMware不能打开虚拟机&#xff0c;每次打开都会出现一个“此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态”的报错&#xff0c;然后因此启动不了虚拟机。今天小编就带来如何解决这个报错的方法。 什么是Intel VT-x&#xff1f; 这是英特尔cp…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战六(引入pinia,注册成功返回的信息在主页显示)

简介 pinia是多页面之间共享数据的一个组件&#xff0c;用法比较简单&#xff0c;具体参照以下。 安装Pinia pnpm install pinia引入Pinia main.ts 新增store src目录下新建stores目录&#xff0c;stores目录下新增user.ts文件 import { ref } from vue; import { define…

论文代码解读STPGNN

1.前言 本次代码文章来自于《2024-AAAI-Spatio-Temporal Pivotal Graph Neural Networks for Traffic Flow Forecasting》&#xff0c;基本模型结构如下图所示&#xff1a; 文章讲解视频链接 代码开源链接 接下来就开始代码解读了。 2.代码解读 class nconv(nn.Module):de…

离散数学答疑 3

&#xff5e;A&#xff1a;A的补集 有时候空集是元素&#xff0c;有时候就是纯粹的空集 A-B的定义&#xff1a; 笛卡尔积&#xff1a; 求等价关系&#xff1a;先求划分再一一列举 不同划分&#xff1a;分几块。一块&#xff1a;两块&#xff1a;三块&#xff1a;分别计算 Ix是…

2024-5-7 石群电路-26

2024-6-7&#xff0c;星期五&#xff0c;15:00&#xff0c;天气&#xff1a;阴转小雨&#xff0c;心情&#xff1a;晴。今天虽然是阴雨天&#xff0c;但是心情不能差哦&#xff0c;离答辩越来越近了&#xff0c;今天学完习好好准备准备ppt&#xff0c;加油学习喽~ 今日观看了石…

Vue 学习笔记 总结

Vue.js 教程 | 菜鸟教程 (runoob.com) 放一下课上的内容 Vue练习 1、练习要求和实验2的用户注册一样&#xff0c;当用户输入后&#xff0c;能在下方显示用户输入的各项内容&#xff08;不需要实现【重置】按钮&#xff09; 2、实验报告中的实验小结部分来谈谈用JS、jQuery和…

接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。 方案 1. 状态机 业务场景&#xff0c;数据审核成功后进行短信通知&#xff0c;或者是订单状态变成已支付后&#xff0c;短信通知用户订单生成的详细信息&#xff0c;等等和状态有关的操作。 假设 status&#xff1a;0&#xff08;待…

vue改造四级树状可输入table

vue改造四级树状可输入table <template><div class"dimension_wary"><div class"itemHeader"><div class"target"></div><div class"sort">X2</div><div class"weight">…

xiaolingcoding 图解网络笔记——基础篇

文章目录 参考一、网络模型有哪几层DMANAPI 机制二、键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;1. HTTP2. DNS3. 协议栈4. TCP5. IP6. MAC7. 网卡8. 交换机9. 路由器10. 服务器 与 客户端的互相扒皮&#xff08;添加、删除头部信息&#xff09;参考图HTTP 请求…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…