【数据结构】五分钟自测主干知识(十)

上一节,我们讲述了二叉树的概念,二叉树又有什么基本操作呢?今天我们来讲述二叉树的应用~

话不多说,书继上回


5.3二叉树的遍历及应用

二叉树由三个基本部分组成:根结点(D),左子树(L),右子树(R)。

因此,对二叉树的遍历可以分别对这三个部分进行。

如果遵循先左后右的原则,可以有三种遍历规则:DLR,LDR,LRD。

分别称为先序遍历中序遍历后序遍历

1.先序遍历

定义:若二叉树为空,则空操作,否则:

(1)访问根结点;

(2)先序遍历左子树;

(3)先序遍历右子树。

按照这个递归定义可以写出先序遍历二叉树的递归算法:

void PreOrder(BiTree T) {
	if (!T) return;
	visite(T->data);//访问根结点
	PreOrder(T->lchild);
	PreOrder(T->rchild);
}
2.中序遍历

定义:若二叉树为空,则空操作,否则:

(1)中序遍历左子树;

(2)访问根结点;

(3)中序遍历右子树。

按照这个递归定义可以写出中序遍历二叉树的递归算法:

void InOrder(BiTree T) {
	if (!T) return;
	InOrder(T->lchild);
	visite(T->data);//访问根结点
	InOrder(T->rchild);
}
3.后序遍历

定义:若二叉树为空,则空操作,否则:

(1)后序遍历左子树;

(2)后序遍历右子树。

(3)访问根结点;

按照这个递归定义可以写出后序遍历二叉树的递归算法:

void PostOrder(BiTree T) {
	if (!T) return;
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	visite(T->data);//访问根结点
}

可见这三种遍历的搜索路线是一样的,只是访问根的时机不同。 

将二叉树上每个空子树用一个虚结点表示,将这样处理后的二叉树称为原二叉树的扩展二叉树

原二叉树上的结点称为内部结点,表示空指针的虚结点称为外部结点

递归算法优点是简洁,但一般而言,其执行效率不高,因为系统需要维护一个运行栈以保证递归过程是正确执行。其实以上遍历还可以使用非遍历方法。

设一存放结点指针的栈S,每访问完一个结点X后,就将结点X的指针入栈,以便后来能通过这个指针找到结点X的右子树。

void PreOrder(BiTree T) {
	InitStack(S);    //初始化一个空栈
	while (T || !StackEmpty(S)) {//遍历结束的条件是栈为空且T为空
		while (T) {
			visite(T->data);
			Push(S, T);    //T进栈
			T = T->lchild;
		}
		if (!StackEmpty(S)) {
			Pop(S, T);    //弹出栈顶指针T
			T = T->rchild;
		}
	}
}

其中有关栈的处理(其中一些函数)详见前面的文章

附链接:【数据结构】五分钟自测主干知识(四)http://t.csdnimg.cn/DffSWicon-default.png?t=N7T8http://t.csdnimg.cn/DffSW


 4.层序遍历

对二叉树除了可以按上述的先序、中序和后序规则进行遍历外,还可以自上而下,自左向右逐层地进行遍历。

在层序遍历时,当第 i 层结点被访问完后,接下来要逐个访问位于第i + 1 层上的第 i 层结点的左孩子和右孩子。这时,在 i层先被访问的结点其左、右孩子将先被访问,因此需要利用一个队列来存放已访问过的结点的孩子,以控制对这些孩子的访问先后次序。层序遍历的算法思路是:


(1)初始化一个空队列,用来保存已访问过结点的孩子;


(2)非空根指针入队;


(3)若队列为空,则遍历结束;否则重复执行:
①队头元素出队,访问之;
②若被访结点有左孩子,则左孩子入队;
③若被访结点有右孩子,则右孩子入队。

void LayerTraversal(BiTree T) {
	InitQueue(Q);
	if (T) EnQueue(Q, T);
	while (!QueueEmpty(Q)) {
		DeQueue(Q, p);
		visite(p->data);
		if (p->lchild) EnQueue(Q, p->lchild);
		if (p->lchild) EnQueue(Q, p->rchild);
	}
}

其中有关队列的处理(其中一些函数)详见前面的文章

附链接:【数据结构】五分钟自测主干知识(五)
http://t.csdnimg.cn/TX4HAicon-default.png?t=N7T8http://t.csdnimg.cn/TX4HA

不论按哪种次序遍历含有n个结点的二叉树,其时间复杂度至少为O(n)


5.二叉树运算举例

1.求二叉树的结点个数

方案1:

int CountNodes1(BiTree T) {
	if (!T) return 0;
	int nl = CountNodes1(T->lchild);
	int nr = CountNodes1(T->rchild);
	return(1 + nl + nr);
}

方案2:

void CountNodes2(BiTree T, int& n) {
	if (!T)return;
	n++;
	CountNodes2(T->lchild, n);
	CountNodes2(T->rchild, n);
}

2.输出二叉树每个结点的层次数

void Level(BiTree T, int lev){
	if (!T)return;
	lev++;
	printf(T->data,lev);
	Level(T->lchild, lev);
	Level(T->rchild, lev);
}

3.求二叉树的深度

好用的递归方法继续:

int Depth(BiTree T) {
	if (!T)return 0;
	int hl = Depth(T->lchild);
	int hr = Depth(T->rchild);
	return (hl > hr ? hl + 1: hr + 1);
}

4.输出二叉树树根到所有叶子结点的路径

void OutPath(BiTree T, Stack& S) {
	if (!T)return;
	Push(S, T);
	if (!T->lchild && !T->rchild)
		StackTraverse(S);
	OutPath(T->lchild, S);
	OutPath(T->rchild, S);
	Pop(S, e);
}

5.(重点)表达式求值

算术表达式可以用二叉树的形式来表示。

用二叉树表示算术表达式的递归方法如下:

(1)如果表达式为常数或简单变量,则二叉树中仅有一个根结点,根结点的数据域存放该表达式的值。

(2)如果表达式的形式是:

(左操作数) 二目运算符 (右操作数)

则二叉树中,以左子树表示左操作数,右子树表示右操作数,根结点的数据域存放二目运算符。

(3)操作数本身又是表达式

例如表达式a+b*(c-d)-e/f的二叉树表示如下:

该二叉树的先序序列为-+a*b-cd/ef

恰好是表达式的前缀表示(波兰式

该二叉树的后序序列为abcd-*+-ef/

恰好是表达式的后缀表示(逆波兰式

 下面给出表达式二叉树结点的存储类型定义:

typedef struct BiNode {
	double val;
	char op;
	unsigned char tag;
	struct BiNode* lchild, * rchild;
}BiTNode,*BiTree;

其中val分量用来存放表达式中的数值,op分量用来存放表达式中的运算符。

tag起标志作用,若tag=0,则表示结点中存放的是数值,取val分量;

若tag=1,则表示结点中存放的是运算符,取op分量。

对表达式求值可用逆波兰式的求值方法,即利用后序遍历完成计算

double Calculate(BiTree T) {
	if (T->tag == 0)return T->val;
	double a = Calculate(T->lchild);
	double b = Calculate(T->rchild);
	return operate(a, T->op, b);//计算并返回a op b
}

其中operate函数表示计算算式值


今天我们就到这里,可以对照黑体字查看主干知识,下一讲,我们聊聊线索二叉树

附链接:【数据结构】五分钟自测主干知识()

长咕一下

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

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

相关文章

ForkJoinPool在生产环境中使用遇到的一个问题

1、背景 在我们的项目中有这么一个场景,需要消费kafka中的消息,并生成对应的工单数据。早些时候程序运行的好好的,但是有一天,我们升级了容器的配置,结果导致部分消息无法消费。而消费者的代码是使用CompletableFutur…

综合知识篇21-项目管理考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

数据结构:插入排序,希尔排序(缩小增量排序)

1.直接插入排序 当插入第 i 个元素时,前面的数据已经排好序了,将后续的数据按大小插入到前面已经排好序的数组中,就是插入排序 特点 1.元素集合越接近有序,时间效率越高 2.时间复杂度O(N^2) 3.空间复杂度O(1) //插入排序 void InsertSort(int* a, int length) {for (int …

2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题

“2021年XX省赛职业院校技能大赛”高职组 计算机网络应用赛项 网络构建模块竞赛真题 目录 一.考试说明 1 二.模块B网络构建 2 (一)任务描述 2 (二)任务清单 9 一.考试说明 本模块比赛时间为…

腾讯云服务器价格查询系统,2024年1年、3年和5年活动价格表

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

windows11 openssh服务开启;第三方ping不通局域网windows电脑;ssh连接内部ubuntu系统

参考:https://blog.csdn.net/2301_77554343/article/details/134328867 1、windows11 openssh开启 1)我这边可选功能在设置-系统里面;其他网上看在应用下;添加可选openssh服务器安装 2)安装后打开,管理员…

vscode的一些技巧

技巧1:调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项: “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2:断点 普通断点使…

数据结构:选择排序,快速排序

1.选择排序 直接遍历数组,找出最大值和最小值,记录下标,将最大值和最小值分别与首位交换 但是由于当begin maxi时,会导致出错,因此需要 if 特殊判断 void Swap(int* a, int* b) {int temp *a;*a *b;*b temp; }void SelectSort(int* a, int n) {int begin 0;int end n …

谷歌地球三维模型下载软件更新

收费软件,白嫖党勿扰 收费金额2000元 1 概述 之前写过一篇《谷歌模型下载》的文章,反馈特别好。我也很欣慰,能够帮到一些同学。但是,有同学反应,软件确实帮了大忙,就是使用起来较麻烦,于是&…

CodeReview的挑战

保证CodeReview质量的前提条件 有良性的社交压力 保证CodeReview质量的先决条件在于建立一个良性、有效的社交压力机制。这种机制始于招聘过程,我们需要吸引那些拥有基础专业素养的开发者,其中包括能够承受并积极响应CodeReview中社交压力的能力。 设想一…

微服务(基础篇-001-介绍、Eureka)

目录 认识微服务(1) 服务架构演变(1.1) 单体架构(1.1.1) 分布式架构(1.1.2) 微服务(1.1.3) 微服务结构 微服务技术对比 企业需求 SpringCloud(1.2) …

34.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录数据包的监视与模拟

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:33.游戏登录数据…

基于大数据的空气质量预测和可视化分析

城市空气质量数据采集系统设计与实现 🏙️ 研究背景 🌬️ 城市化与环境挑战:随着城市化进程的加快,环境污染问题,尤其是空气质量问题,已成为公众关注的焦点。数据监测的重要性:城市空气质量数…

Qt 压缩/解压文件

前面讲了很多Qt的文件操作,文件操作自然就包括压缩与解压缩文件了,正好最近项目里要用到压缩以及解压缩文件,所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…

思科网络中DHCP中继的配置

一、什么是DHCP中继?DHCP中继有什么用? (1)DHCP中继是指一种网络设备或服务,用于在不同的子网之间传递DHCP(动态主机配置协议)消息。DHCP中继的作用是帮助客户端设备获取IP地址和其他网络配置信息&#x…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高,性能要好通常用来做自动驾驶的AI推理,具体外观如下图 1.刷机软件sdkmanager:下载链接 NVIDIA账号需要注册,正常一步一步往下走就行。在ubuntu18以上的系统安…

[iOS]GCD(一)

[iOS]GCD(一) 文章目录 [iOS]GCD(一)GCD的概要GCD的APIDispatch Queuedispatch_queue_createMain Dispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_applydispatch_applydispatch_suspend/dispatch_resumeDispatch Semaphoredispatch_onc…

LeetCode 面试经典150题 14.最长公共前缀

题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路: 代码: class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…

c语言 实现切片数组

文章目录 前言一、接口定义1、创建切片2、销毁切片3、添加元素4、切片长度5、切片容量 二、完整代码三、使用示例1、一般使用流程2、直接append3、自定义类型 总结 前言 由于c语言没有集合类的标准库,需要用时只能自己实现,由于c语言没有泛型&#xff0…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…