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

目录

层序遍历

思路图解

代码实现 

二叉树遍历的应用

 输出二叉树中的叶节点

代码实现

求二叉树的高度

思路图解 

代码实现 

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

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


层序遍历

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

先根节点入队,然后:

  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数据结构——陈越、何钦铭 

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

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

相关文章

【从零开始学Skynet】基础篇(七):Mysql数据库常用API

在上一篇中我们完成了对Mysql数据库的准备工作之后,这一篇我们写一个程序测试一下。 1、Mysql API 在写程序之前,我们先学习一下Mysql数据库常用API的使用: API说明mysql.connet(args)连接数据库,参数args是一个Lua表&#xff0c…

【敬伟ps教程】平移、缩放、移动、选区

文章目录 平移抓手工具旋转抓手 缩放工具移动工具详解选区选区工具详解 平移 抓手工具 当打开一张大图时,可以通过修改底部的百分比或使用抓手工具(H或在任何时候按住空格键来使用抓手工具)来查看更多细节 使用抓手工具时滚动所有打开的文…

仿真创新大赛—国三省一 智能鱼缸(proteus)(stm32)

⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩去年下半年参加了全国仿真创新大赛,也是取得了国赛三等奖,省赛一等奖的好成绩。 ⏩本篇文章对我们的参赛作品《智能鱼缸》做一个简介。 ⏩感…

【前缀和】

目录 知识框架No.0 筑基No.1一维前缀和No.2 二维前缀和题目来源:Acwing-796. 子矩阵的和 No.1 普通前缀和题目来源:牛客网-NC14556:数圈圈题目来源:牛客网-NC14600:珂朵莉与宇宙题目来源:牛客网-NC21195 &a…

优化 Kafka 的生产者和消费者

背景 如今,分布式架构已经成为事实上的架构模范,这使得通过 REST API 和 消息中间件来降低微服务之间的耦合变得必然。就消息中间件而言,Apache Kafka 已经普遍存在于如今的分布式系统中。Apache Kafka 是一个强大的、分布式的、备份的消息服…

matplotlib的配色(随机颜色函数,各种渐变色,彩虹色)

也是画图的时候经常会遇到的问题,什么颜色好看? 先直接上一个配色表: plt官网:List of named colors — Matplotlib 3.8.0.dev898g4f5b5741ce documentation 需要什么颜色传入就行了。 例如我下面画一个柱状图,自己选…

云擎未来,智信天下 | 2023移动云大会来了!

新三年,新征程 2023年作为新三年开局之年 移动云又将以怎样的 全新品牌形象、全新战略规划 向“一流云服务商”战略目标勇毅前行? 答案就在这里: 2023移动云大会,官宣定档! 2023.4.25 - 4.26 苏州金鸡湖国际会…

Android 中的混音器 AudioMixer 实现分析

Android framework 的音频处理模库 libaudioprocessing (位于 frameworks/av/media/libaudioprocessing) 提供了混音器组件 AudioMixer,它主要用在 audioflinger 里,用来将多路音频源数据混音,以方便送进音频设备播放出来。 音频混音操作本身…

8.2 正态总体的参数的检验

学习目标: 如果我要学习正态总数的参数检验,我会按照以下步骤进行学习: 学习正态分布的基本知识:正态分布是统计学中非常重要的概率分布之一,掌握其基本知识包括概率密度函数、期望值、方差、标准差等是非常重要的。 …

最佳实践:Android应用中的网络请求和数据缓存

最佳实践:Android应用中的网络请求和数据缓存 网络请求在Android应用中的重要性 在现代移动应用中,网络请求扮演着重要的角色,涉及到数据的获取、上传、更新等功能。网络请求在Android应用中具有关键地位,对于提供优秀的用户体验和…

IDEA配置MAVEN_OPTS

IDEA配置MAVEN_OPTS​ 解决问题 maven MAVEN_OPTS设置 maven编译优化 maven编译速度慢 maven打包编译很慢 maven多线程编译打包 IDEA Maven配置教程​​测试环境:Win10(64位) i7-7700HQ 16GB​​ 参考文章: ​​ ​JVM参数MetaspaceSize的误解​​ Java HotSpot™ 64-Bit Ser…

数字化转型迫在眉睫!药企如何应用AI技术加速创新?

导语 | 近年来,随着 AI 等技术的发展应用,数字化、智能化日渐成为各行各业转型升级的新兴力量,其与医药产业的融合创新也逐渐成为当前的新趋势,众多医药制造企业蓄势待发,搭乘数字化的快车,驶入高速发展的快…

[计算机图形学]几何:网格处理(前瞻预习/复习回顾)

一、前言 网格的三种处理:网格细分,网格简化,网格正则化,细分会产生更多的三角面片来让模型更加光滑,简化则相反会减少网格的三角面片数量,正则化则会让三角形面更加规则。如上图中最右边两幅图&#xff0…

理解C语言中的空指针和野指针

在C语言中,指针是一个非常重要的概念,可以用于操作变量和数据结构。但是,指针也是很容易出错的地方。其中包括两种可能的错误:空指针和野指针。 空指针 空指针指代无效的地址,表示指针不指向内存中的任何一个合法对象…

浏览器便携化操作方法

直接进入主题 如果我们不想把 Chrome 安装进 C 盘,又或者想测试多配置,那么浏览器的便携化就非常重要了。 浏览器便携化的方法有很多,国内常用的有两种。 1、MyChrome MyChrome 最早由网友“甲壳虫”开发,除了浏览器便携化&a…

camunda如何启动一个流程

在 Camunda 中启动一个流程需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的启动流程的方式: 1、通过 Camunda 任务列表启动流程:在 Camunda 任务列表中,可以看到已经部署的流程,并可以点击“Start”按钮&am…

【微服务】6、一篇文章学会使用 SpringCloud 的网关

目录 一、网关作用二、网关的技术实现三、简单使用四、predicates(1) 网关路由可配置的内容(2) 路由断言工厂(Route Predicate Factory) 五、filters(1) GatewayFilter(2) 给全部进入 userservice 的请求添加请求头(3) 全局过滤器 —— GlobalFilter(4) …

如何在矩池云上部署 Carla,模拟自动驾驶

简介 Carla 是一款基于 Python 编写和 UE(虚幻引擎)的开源仿真器,用于模拟自动驾驶车辆在不同场景下的行为和决策。它提供了高度可定制和可扩展的驾驶环境,包括城市、高速公路和农村道路等。Carla 还提供了丰富的 API 和工具&…

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法 环检测算法(DFS)[207. 课程表](https://leetcode.cn/problems/course-schedule/) 拓扑排序算法(DFS)[210. 课程表 II](https://leetcode.cn/problems/course-schedule-ii/) 环检测算法(BFS)拓扑排序算法(BFS) ⚠申明&#xff1…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已,所携带的cookie往往都不止一个,而是一堆,甚至特别特别长,postman文档提供的cookie操作是全局的,但需要一个一个打(折磨),唯一的优点就是作用域…