数据结构之二叉树的遍历

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构(或物理结构)。数据结构按照逻辑关系的不同分为线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
  二叉树是 n(n≥0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的且分别称为左、右子树的二叉树所组成。可见,二叉树具有递归性质。
  遍历是按某种策略访问树中的每个结点,且仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由根结点、左子树和右子树三部分构成的,因此若能依次遍历这三部分,也就遍历了整棵二叉树。按照先遍历左子树后遍历右子树的约定,根据访问根结点位置的不同,可得到二叉树的先序、中序和后序3种遍历方法。此外,对二叉树还可进行层序遍历。
  【函数】二叉树的先序遍历。

void PreOrder(BiTree root){
	if (root != NULL) {
		printf("%d", root->data);	/*访问根结点*/
		PreOrder(root->lchild);		/*先序遍历根结点的左子树*/
		PreOrder(root->rchild);		/*先序遍历根结点的右子树*/
	}/*if*/
}/*PreOrder*/

  【函数】二叉树的中序遍历。

void InOrder(BiTree root){
	if (root != NULL){
		InOrder(root->lchild);		/*中序遍历根结点的左子树*/
		printf("%d", root->data);	/*访问根结点*/
		InOrder(root->rchild);		/*中序遍历根结点的右子树*/
	}/*if*/
}/*InOrder*/

  【函数】二叉树的后序遍历

void PostOrder(BiTree root){
	if(root != NULL) {
		PostOrder(root->lchild);	/*后序遍历根结点的左子树*/
		PostOrder(root->rchild);	/*后序遍历根结点的右子树*/
		printf("%d", root->data);	/*访问根结点*/
	}/*if*/
}/*PostOrder*/

  从根结点出发,3种方法的遍历路线如下图所示。该路线从根结点出发,逆时针沿着二叉树的外缘移动,对每个结点均途经三次。若第一次经过结点时进行访问,则是先序遍历;若第二次(或第三次)经过结点时访问结点,则是中序遍历(或后序遍历)。因此,只要将遍历路线上所有在第一次、第二次和第三次经过的结点信息分别输出,即可分别得到该二叉树的先序、中序和后序遍历序列。所以,若去掉 3 种遍历算法中的打印输出语句,则3种遍历方法相同。这说明3种遍历过程的路线相同。
在这里插入图片描述

  遍历二叉树的基本操作就是访问结点,不论按照哪种次序遍历,对于含有 n 个结点的二叉树,遍历算法的时间复杂度都为 O(n)。因为在遍历的过程中,每进行一次递归调用,都是将函数的“活动记录”压入栈中,因此,栈的最大长度恰为树的高度。所以,在最坏情况下,二叉树是有n个结点且高度为n的单枝树,遍历算法的空间复杂度也为(n)。
  借助于一个栈,可将二叉树的递归遍历算法转换为非递归算法。下面给出中序遍历的非递归算法。
  【函数】二叉树的中序非递归遍历算法。

int InOrderTraverse(BiTree root){			/*二叉树的非递归中序遍历算法*/
	BiTree p;
	InitStack(St);							/*创建一个空栈*/
	p=root;									/*p指向树根结点*/
	while (p != NULL || !isEmpty(St)) {
		if (p!= NULL) {						/*不是空树*/
			Push(St, p);					/*根结点指针入栈*/
			p = p->lchild;					/*进入根的左子树*/
		} else {
			q=Top(St);	Pop(St);			/*栈顶元素出栈*/
			printf("%d", q->data);			/*访间根结点*/
			p = q->rchild;					/*进入根的右子树*/
		}/*if*/
	}/*while*/
}/*InOrderTraverse*/

  遍历二叉树的过程实质上是按一定的规则将树中的结点排成一个线性序列的过程,因此遍历操作得到的是树中结点的一个线性序列。在每一种序列中,有且仅有一个起始点和一个终结点,其余结点有且仅有唯一的直接前驱和直接后继。显然,关于结点的前驱和后继的讨论是针对某一个遍历序列而言的。
  对二叉树还可以进行层序遍历。设二叉树的根结点所在的层数为1,层序遍历就是从树的根结点出发,首先访问第一层的树根结点,然后从左到右依次访问第二层上的结点,其次是第三层上的结点,依此类推,自上而下、自左至右逐层访问树中各结点的过程就是层序遍历。
  【算法】二叉树的层序遍历算法。

void LevelOrder(BiTree root){		/*二叉树的层序遍历算法*/
	BiTree p;
	InitQueue(Q);					/*创建一个空队列*/
	EnQueue(Q, root);				/*将根指针加入队列*/
	while (!isEmpty(Q)){			/*队列不空*/
		DeQueue(Q, p);				/*队头元素出队,并使p取队头元素的值*/
		printf("%d", p->data);		/*访问结点*/
		if (p->lchild)	EnQueue(p->lchild);
		if (p->rchild)	EnQueue(p->rchild);
	}/*while*/
}/*LevelOrder*/
		

  
  
  

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

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

相关文章

STM32F407移植OpenHarmony笔记1

参考文档: OpenAtom OpenHarmonywidthdevice-width,initial-scale1.0https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/get-code/gettools-acquire.md/ 搭建环境 安装linux系统: Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-91-generic x86_64) 下载源代码&a…

【服务器GPT+MJ+GPTs】创建部署GPT+MJ+GPTs程序网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建GPT+MJ+GPTs】 🌼1. 给服务器添加端口 🌼2. 安装宝塔 🌼3. 安装Docker 🌼4. 安装ChatGPT程序 🌼5. 程序更新 🌼6. 修改端口 | 密码 🌼7. 绑定域名+申请SSL证书 🌺【前言】 相信大家都对openai的产品ch…

【洛谷】P1443 马的遍历(BFS)

由于在 x,y 表示 x 行 y 列还是 y 行 x 列上存在歧义,另外提供一组测试数据: // input: 5 5 2 3// output: 1 2 3 2 1 2 3 0 3 2 1 2 3 2 1 4 1 2 1 4 3 2 3 2 3 可以说&…

Qt基础-窗体添加图标

本文演示Qt窗体如何添加图标 创建项目添加资源文件 打开窗体的设计窗口 选择windowIcon属性,点击下箭头-选择资源,选择资源文件,(格式不受限制) 点击OK即可 运行看效果

【小呆的力学笔记】弹塑性力学的初步认知二:应力应变分析(2)

文章目录 1.4 主应力空间、八面体应力1.5 应变分析1.6 特殊应力、应变定义 1.4 主应力空间、八面体应力 一点的应力状态不论如何变化,其主应力和主方向一致的话,该点的应力状态就是唯一确定的。因此,我们用主应力方向建立一个三维坐标系来描…

【Linux】基础命令及测试工作常用

一、Linux基础命令 【基础】 tab补全 chtrlc停止进程 绝对路径: 以 / 开头,从根目录下开始寻找路径 相对路径: 不以 / 开头,从当前目录下开始寻找 1、系统管理相关命令 ifconfig 显示或设置网络设备的命令,我们可…

[实战]加密传输数据解密

前言 下面将分享一些实际的渗透测试经验,帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主,技巧为辅,进入逆向的大门。 技巧 开局先讲一下技巧,掌握好了技巧,方便逆向的时候可以更加快速的找到关键函数…

mybatisplus做SQL拦截添加自定义排序

前言 工作中写的一段代码,备个份,以后兴许能直接用 功能描述:如果前端传入了排序规则,则优先按传入的字段进行排序,SQL原有的排序规则追加到末尾 注:我们项目里的分页查询,是基于XML的SQL执行的…

RedisInsight详细安装教程

简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持)。 RedisIn…

第四篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:机器学习

传奇开心短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文 短博文目录一、项目目标二、OpenCV机器学习介绍三、OpenCV支持向量机示例代码四、OpenCV支持向量机示例代码扩展五、OpenCVK均值聚类示例代码六、OpenCVK均值聚类示例代码扩展七、OpenCV决策树示例…

调优 mybatis saveBatch 25倍性能

调优 mybatis saveBatch 25倍性能 最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch…

Geogebra绘制正态分布曲线-学习b站何威老师视频

​ 参考资料 GeoGebra系列教程3——GGB与正态分布密度曲线_哔哩哔哩_bilibili 我要开始学习啦,吼吼~~~ 准备工作 https://www.geogebra.org/download 选择GeoGebra 经典 6 详细步骤 设计思路具体操作设计积分区间【a,b】创建滑动条a∈[-5,5],增量是…

P4学习(七)实验四:Explicit Congestion Notification

目录 一. 实验目的二.前置知识略概三. 实验过程1. Topo2. Egress 三. 实验结果1.启动监听服务端2.发送数据包3.查看h2.log的数据4.Iperf模拟Flood超过门限 四.为什么要在Egress上进行ecn的配置 一. 实验目的 ECN allows end-to-end notification of network congestion without…

Android SeekBar 进度条圆角

先看下效果图&#xff1a; 之前&#xff1a; 优化后&#xff1a; 之前的不是圆角是clip切割导致的 全代码&#xff1a; <SeekBarandroid:layout_width"188dp"android:layout_height"wrap_content"android:background"null"android:focusa…

专门为机器学习开发的jpy语言

这本来是一个为工科教学专门开发的附属品&#xff0c;并不是说Python或Java有多不好&#xff0c;根本上它就是一个Java工程教材&#xff0c;但又要结合人工智能。因此&#xff0c;出现了这样一个包容性的怪胎&#xff0c;可以用python一样的语法与Java一起编写。 没流行起来的一…

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复&#xff0c;这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

手上 ROC-RK3399-PC Pro 使用蓝牙 WIFI 模组是 AP6256。 一、AP6256 模组介绍 AP6256是正基科技(AMPAK)推出的一款低成本、低功耗的双模模块,它集成了Wi-Fi和蓝牙功能。这款模块支持SDIO接口,具有以下特点: 1、型号:AP6256 2、接口:SDIO(Secure Digital Input/Outp…

搜维尔科技:【简报】元宇宙数字人赛道,优秀作品赏析《大福太郎》

这次采用亮眼的浅粉做为发色&#xff0c;为了贴合她小警察的身分 给了她一顶特制的警帽&#xff0c;上面有大福的荧光蓝叶片作为标 志&#xff0c;而在配件及裙子上也加入了许多科技元素的小巧思。 学校&#xff1a; 朝阳科技大学&#xff08;台湾&#xff09; 选手&#xff…

排序算法经典模型: 梯度提升决策树(GBDT)的应用实战

目录 一、Boosting训练与预测 二、梯度增强的思想核心 三、如何构造弱学习器和加权平均的权重 四、损失函数 五、梯度增强决策树 六、GBDT生成新特征 主要思想 构造流程 七、梯度增强决策树以及在搜索的应用 7.1 GDBT模型调参 7.1.1 框架层面参数 n_estimators su…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1(附项目源码)

本篇最终效果演示 文章目录 本篇最终效果演示系列目录前言环境素材绘制地形 实现人物移动指示显示物品名称源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】实现类似七日杀、森…