数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

news2025/1/17 3:13:27

目录

层序遍历

思路图解

代码实现 

二叉树遍历的应用

 输出二叉树中的叶节点

代码实现

求二叉树的高度

思路图解 

代码实现 

 二元运算表达式树及其遍历

由两种遍历序列确定二叉树 


层序遍历

层序遍历可以通过一个队列来实现,其基本过程为:

先根节点入队,然后:

  1. 从队列中取出一个元素;
  2. 访问该元素所指的节点;
  3. 若该元素所指节点的左、右孩子节点非空, 则将其左、右孩子的指针顺序入队。
  4. 循环123的步骤,直到队列为空。

思路图解

代码实现 

void LevelOrderTraversal(BinTree BT)
{
	Queue Q;
	BinTree T;
	if (!BT)
	{
		return; //若为空树则直接返回
	}
	Q = CreateQueue(); //创建并初始化队列Q
	Add(Q, BT);
	while (!IsEmptyQ(Q))
	{
		T = DeleteQ(Q);
		printf("%d\n", T->data);  //访问取出来的节点
		//若该元素的左右孩子节点不为空,则依次入队
		if (T->Left)
		{
			AddQ(Q, T->Left);     
		}
		if (T->Right)
		{
			AddQ(Q, T->Right);
		}
	}
}

 

二叉树遍历的应用

 输出二叉树中的叶节点

之前讲过的递归先序遍历二叉树写法很简单,而要输出二叉树中的叶节点,就可以在进行遍历的过程中进行检测,如果为叶节点则输出,否则继续遍历。 叶节点即左孩子节点为空、右孩子节点也为空。

代码实现

void PreOrderPrintLeaves(BinTree BT)
{
	if (BT)
	{
		if (!BT->Left && !BT->Right)
			printf("%d ", BT->data);
		PreOrderPrintLeaves(BT->Left);
		PreOrderPrintLeaves(BT->Right);
	}
}

求二叉树的高度

树是递归定义的,一颗二叉树的高度应该等于左右两颗子树的最大高度+1 求二叉树的高度,利用的是后序遍历的一种程序框架来实现的。

思路图解 

代码实现 

int PostOrderGetHeight(BinTree BT)
{
	int HL, HR, MaxH;
	if (BT)
	{
		HL = PostOrderGetHeight(BT->Left);   //求左子树的高度
		HR = PostOrderGetHeight(BT->Right);  //求右子树的高度
		MaxH = (HL > HR) ? HL : HR;          //取左右子树的最大高度
		return (MaxH + 1);                   //返回树的高度
	}
	else
	{
		return 0;                            //空树的高度为0
	}
}

 

 二元运算表达式树及其遍历

对上面的表达式树进行三种遍历,可以得到三种不同的访问结果:

试着分别写出上面表达式树前序中序和后序遍历的不同表达式,复习一遍之前讲的树的遍历。 



先序遍历可以得到前缀表达式:++a*bc*+*defg

中序遍历可以得到中缀表达式:a+b*c+d*e+f*g

后序遍历可以得到后缀表达式:abc*+de*f+g*+

但需要注意的是:中缀表达式会受到运算符优先级的影响,所以单单这样通过中序遍历得出的中缀表达式是不完全准确的。

解决方法是:在输出左子树之前,先输出一个左括号,左子树结束的时候再输出一个右括号。

由两种遍历序列确定二叉树 

已知三种遍历中的任意两种遍历序列,能否唯一确定一颗二叉树呢?

答案是:两种遍历序列中,必须要有一种是中序遍历才能够唯一确定一颗二叉树。

假设没有中序,看下面两个序列:

先序遍历序列:A B

后序遍历序列:B A 

像这样一组简单的序列,只有先序遍历序列和后序遍历序列的情况下,就有两颗是符合的二叉树,其中根节点是容易确定的,先序的第一个节点就是根,后序的最后一个节点就是根;但是左右节点是不好区分的,所以就导致了只有先序序列和后序序列的情况下没法唯一地确认一颗二叉树。

下面就来看看,已知先序序列和中序序列,怎么样来确定一颗二叉树。

思路:

  1. 根据先序遍历序列第一个节点确定根节点;
  2. 根据根节点在中序遍历序列中分割出左右两个子序列;
  3. 对左子树和右子树分别递归使用相同的方法继续分解。 

 

举个例子清晰一下思路:

先序序列: abcdefghij

中序序列: cbedahgijf 

所以最终通过先序遍历序列和中序遍历序列唯一确定的二叉树就为:

 


 end


学习自:MOOC数据结构——陈越、何钦铭 

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

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

相关文章

计算机网络P5~P7

目录 1.计算机网路性能指标 2.吞吐量 3.时延 4.时延带宽积 5.往返时间 6.利用率 7.丢包率 8.计算机体系结构 1.计算机网路性能指标 速率和带宽 速率 :每秒传输的比特的个数 单位 b/s kb/s mb/s gb/s 带宽:表示传送数据的能力 。带宽可以理解为高…

医院手术麻醉信息管理系统源码

医院手术麻醉信息管理系统源码 实现整个围术期术前、术中、术后的全数字化和信息化。 医院手术麻醉临床信息管理系统是一种基于云计算技术的信息系统,它可以帮助医院更好地管理手术麻醉临床信息,提高手术麻醉的安全性和效率。 首先,医院手术…

数学分析:多元微积分1

卓里奇的数学分析的好处在于直接从多元函数来入手多元微积分,引出矩阵,十分自然。 紧集的概念,感觉直接用闭集去理解就行,(对于图形学来说)。 多元函数的极限,其实和单元函数并没有什么区别。 这…

在你眨眼时,VR这样欺骗你的视觉

VR的沉浸感,可以让人仿佛置身于现实之外,还可以利用各种生物传感特性,来模拟一种具有存在感的虚拟空间。实际上,VR可以很好的欺骗人的感官,比如尽管你身处空间有限的房间中,但在VR中你仿佛已来到开阔的户外…

网络应用程序设计(idea版)——实验三:Web组件重用与JavaBeans

目录 实验预习报告 一、实验目的 二、实验原理 三、实验预习内容 实验报告 一、实验目的 二、实验要求 三、实验内容及要求 实验预习报告 一、实验目的 1. 理解静态包含和动态包含的概念,掌握相关指令和动作的使用; 2. 掌握JavaBeans的含义和…

路科验证UVM入门与进阶详解实验3

在UVM——lab3中,将SV环境移植到UVM的重点内容如下: TLM的单向、多向通信端口使用TLM的通信管道UVM的回调类型 uvm_callbackUVM的一些仿真控制函数TLM单向、多向通信 1、何为事务级、何为事务级通信(TLM)?有什么用&am…

禁用linux系统默认的22端口号

前提条件:在云平台上开放一个代替22的端口。 1、需查看服务器的防火墙是否开启, 命令:systemctl status firewalld.service 如果防火墙的状态为开启,在运行,需要先在防火墙增加端口 1.命令:firewall-cm…

【消息队列】Kafka如何实现高性能IO

我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步\同步方式发送,采用高效的压缩算法&#…

JavaWeb03 Cookie和Session

一个网站怎么证明你来过? 1.首次访问时服务器给客户端一个cookie,下次客户端再次访问会自动携带cookie,注意cookie可以是多个 2.首次访问时服务器登记了客户端一系列信息,下次客户端再进行访问时服务器自动匹配此客户端是否访问…

Win10搭建我的世界Minecraft服务器「内网穿透远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机转载…

Mac远程控制工具有哪些

适用于Mac的远程控制工具有很多,这里我们给大家列举五个常用软件。 1、Apple Remote Desktop 苹果自带远程桌面正如其名称所承诺的那样。作为 Apple 出品的应用程序,您可以想象它的配置和上手是多么容易。从 App Store 下载 Apple Remote Desktop 后&a…

ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现,它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程,以满足多线程并发执行任务的需要。 FutureTask作用 FutureTask的主要作用…

自动化篇 | 13 | app自动化:airtest

1 airtes简介 1.1 参考地址 http://airtest.netease.com/ # airtest官网 https://airtest.doc.io.netease.com/ # airtest操作方法 https://airtest.doc.io.netease.com/IDEdocs/faq/1_code_examples/ # 代码示例2 airtest架构 Airtest框架 3 airtest使用 3.1 打开界…

【C语言】猜数字游戏的实现

简单不先于复杂,而是在复杂之后。 目录 1.思路(代码会附在最后面) 2.随机数函数rand 1.思路(代码会附在最后面) 首先实现一个猜数字游戏我们先要有一个思路:1.产生一个随机数 2.猜数字 3.可能猜大了 4.可能…

java简单一写一个springboot入门案例

首先 我们先打开idea编辑器 然后 选择File New>Project… 项目的话 我们选择 Spring lnitializr 右边的路径要改一下 然后 选择好路径之后 一定要要在后面加上 \项目名 例如 我这里 选择了 D盘下的学习案例下的springbootDom 项目名叫 threshold 那就这样配置 java版本选…

探索【PhySO】

目录0、 初步报错情况1、230、 初步报错情况 根据原链接,已确定安装成功,运行demo时出现报错,不能正常运行 报错: .Dummy epoch time 238.366736 ms .Dummy epoch time (w duplicate elimination) 180.852427 ms (found 15/1…

【结构型模式】代理模式

文章目录优秀借鉴1、简介2、结构3、实现方式3.1、案例引入3.2、静态代理3.3、JDK动态代理3.4、CGLIB动态代理4、区别对比4.1、静态代理和动态代理4.2、JDK动态代理和CGLIB动态代理5、代理模式优缺点6、应用场景优秀借鉴 设计模式(四)——搞懂什么是代理…

线段树的懒标记

上次看的那个视频讲线段树的时候压根没讲懒标记,然后我今天去写题目直接被薄纱!都是70分,剩下3个节点tml!!! 懒标记 我们在修改一些区间的时候,按照我昨天来学的来修改要改到最下面的叶节点去…

Visual Studio如何将UTF-8字符串输出到控制台

解决c语言使用libcurl库时控制台输出中文出现乱码的问题。 字符编码问题一直以来都是Windows系统的诟病,而Visual Studio也是饱受此诟病。由于历史原因,Windows系统对各个不同的国家地区可能采用不同的code page。由于早先Unicode并未发展成熟&#xff0…

Java设计模式之工厂模式

什么是工厂模式 工厂模式就是将创建对象的具体过程和使用过程分开,这样能够使代码更加灵活。 工厂模式主要分为三类: 简单工厂模式工厂方法模式抽象工厂模式 比如在没有工厂的时候,用户需要一台奥迪车,那么就需要用户去创建一台…