【初阶数据结构篇】链式结构二叉树(续)

文章目录

须知

💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!

👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!

接上篇:【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)-CSDN博客

 2.6 二叉树查找位置x的节点
  • 分为左右子树查找,依次递推即可
  • 结束条件为空:说明在这一路径上没有找到
  • 进入第二个if,说明找到了直接返回结点指针
2.6.1 示例代码:
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}

	BTNode* leftFind = BinaryTreeFind(root->left, x);
	if (leftFind)
	{
		return leftFind;
	}
	BTNode* rightFind = BinaryTreeFind(root->right, x);
	if (rightFind)
	{
		return rightFind;
	}
	return NULL;
}
2.7 二叉树的销毁 
2.7.1示例代码:
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&((*root)->left));
	BinaryTreeDestory(&((*root)->right));

	free(*root);
	*root = NULL;
}

图解:

2.8 二叉树的层序遍历

 层序遍历:对于树型结构,层序遍历就是按层从上到下,每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明:对于左边的二叉树,按层划分后可得到右边的分层结构。

简单来说就是从上到下从左往右打印节点中的数据。

实现层序遍历需要借助数据结构队列(先进先出)

先将根节点入队列, 出队列前打印根节点的数据,同时将根节点的左右孩子入队列,重复该过程,直至队列为空。

2.8.1 示例代码:
//层序遍历
//借助数据结构---队列
void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		//取队头,打印
		BTNode* front = QueueFront(&q);
		printf("%d ", front->data);
		QueuePop(&q);
		//队头节点的左右孩子入队列
		if (front->left)
			QueuePush(&q, front->left);
		if (front->right)
			QueuePush(&q, front->right);
	}
	//队列为空
	QueueDestroy(&q);
}
2.9 完全二叉树的判断

 取队头,左右节点全入队列,当取出对头为空,跳出循环。

进入第二个循环判断剩下的队列是否有非空节点

有则为非完全二叉树,反之亦然。

2.9.1 示例代码:
//判断二叉树是否为完全二叉树
//---队列
bool BinaryTreeComplete(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front == NULL)
		{
			break;
		}
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}
	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}
	QueueDestroy(&q);
	return true;
}
3. 二叉树性质选择题

二叉树性质

对任何⼀棵⼆叉树, 如果度为 0 其叶结点个数为 n 0 , 度为 2 的分⽀结点个数为 n 2 ,则有
n 0 = n 2 + 1.

证明:

 

假设⼀个⼆叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点,则这个⼆叉树的边数是
2a+b
另⼀⽅⾯,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1
结合上⾯两个公式:
2a+b = a+b+c-1 ,即a=c-1。
3.1 题目1
1. 某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )
A 不存在这样的⼆叉树
B 200
C 198
D 199
选B
根据上述二叉树性质
n0=n2+1即n0=199+1=200
3.2 题目2
2. 在具有 2n 个结点的完全⼆叉树中,叶⼦结点个数为( )
A n
B n+1
C n-1
D n/2
完全二叉树只含有0/1个度为1的节点个数。
选A
3.3 题目3
3. ⼀棵完全⼆叉树的结点数位为 531 个,那么这棵树的⾼度为( )
A 11
B 10
C 8
D 12
选B
 3.4 题目4
4. ⼀个具有 767 个结点的完全⼆叉树,其叶⼦结点个数为()
A 383
B 384
C 385
D 386

 

选B 

4 二叉树遍历选择题
4.1 题目1
1. 某完全⼆叉树按层次输出(同⼀层从左到右)的序列为 ABCDEFGH 。该完全⼆叉树的前序序列为(
A ABDHECFG
B ABCDEFGH
C HDBEAFCG
D HDEBFGCA

选A 

4.2 题目2
2. ⼆叉树的先序遍历和中序遍历如下:先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则⼆叉树根结点为
()
A E
B F
C G
D H

 

根据先序遍历(根左右):

选A 

4.3 题目3
3. 设⼀课⼆叉树的中序遍历序列: badce ,后序遍历序列: bdeca ,则⼆叉树前序遍历序列为 ____
A adbce
B decab
C debac
D abcde

根据先序遍历规则:abcde

选D

4.4 题目4
4. 某⼆叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同⼀层从左到右)
的序列
A FEDCBA
B CBAFED
C DEFCBA
D ABCDEF

根据层序遍历规则:FEDCBA

选A 

相信通过这篇文章你对二叉数性质与遍历的有了进一步的了解。如果此篇文章对你学习数据结构(二叉树)有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会!!!

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

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

相关文章

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件,它提供了一个标签页式的界面,允许用户在不同的页面(或称为标签)之间切换。每个页面都可以包含不同的内容,如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(5)_单例模式与线程池 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论&a…

Spark中的宽窄依赖

一、什么是依赖关系 这里通过一张图来解释: result_rdd是由tuple_rdd使用reduceByKey算子得到的, 而tuple_rdd是由word_rdd使用map算子得到的,word_rdd又是由input_rdd使用flatMap算子得到的。它们之间的关系就称为依赖关系! 二…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…

一体化运维监控管理平台详解:构建高效运维体系

在当今数字化转型的大潮中,IT系统的复杂性和规模不断扩大,运维工作的挑战也随之增加。为了应对这一挑战,我们推出了一体化运维监控管理平台,旨在通过全面、智能的监控手段,提升运维效率,保障业务连续性。本…

FBX福币交易所A股三大指数小幅低开 稀土永磁板块回调

查查配分析11月5日电 周二,A股三大指数小幅低开。沪指开盘跌0.10%报3306.81点,深证成指开盘跌0.09%报10653.20点,创业板指开盘跌0.05%报2184.90点。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 来源:同花顺iFinD 盘面…

【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)

气象数据一直是一个价值很高的数据,它被广泛用于各个领域的研究当中。这其中,又以平均气温数据最为常用!之前我们分享过来源于美国国家海洋和大气管理局(NOAA)下设的国家环境信息中心(NCEI)发布的1929-2024年全球站点的…

云渲染与汽车CGI图像技术优势和劣势

在数字时代,云渲染技术以其独特的优势在汽车CGI图像制作中占据了重要地位。云渲染通过利用云计算的分布式处理能力,将渲染任务分配给云端的服务器集群进行计算,从而实现高效、高质量的渲染效果。 这种技术的优势主要体现在以下几个方面&#…

QT仿QQ聊天项目,第三节,实现主界面(好友列表)

目录 一,主界面示例 二,主界面控件组成 三,好友列表实现 1,好友列表的实现原理 2,实现示例代码 一,主界面示例 二,主界面控件组成 三,好友列表实现 1,好友列表的实现…

20241105编译荣品的Android13并给荣品PRO-RK3566开发板刷机

20241105编译荣品的Android13并给荣品PRO-RK3566开发板刷机 2024/11/5 19:10 荣品SDK版本呢:rk-android13-20240713.tgz cf9cea18d26ad7db31b000a7d13b09c2 rk-android13-20240713.tgz 精简步骤: rootrootrootroot-desktop:~$ cd Android13.0/rootrootr…

KVM虚拟机的冷热迁移

首先了解在KVM(Kernel-based Virtual Machine)环境中,冷热迁移是指将虚拟机从一台主机迁移到另一台主机的过程,根据虚拟机是否需要停机,迁移分为热迁移和冷迁移: 冷迁移(Cold Migration&#x…

讲讲软件业务设计原则?

大家好,我是锋哥。今天分享关于【讲讲软件业务设计原则?】面试题。希望对大家有帮助; 讲讲软件业务设计原则? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在软件开发过程中,如何设计一个既高效又可维护…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

快来了解一下服务器虚拟化!!!

服务器虚拟化是信息技术领域的一项重要技术,它允许在单一的物理服务器上运行多个虚拟服务器(虚拟机,VMs),每个虚拟机都可以运行自己的操作系统和应用程序。这项技术通过引入一层名为虚拟化层或虚拟机监视器&#xff08…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

Oracle视频基础1.3.6练习

1.3.6 以下是您的需求清单(不含解决方案): 检查数据库启动情况等待会话结束,进行正常关机等待事务全部提交后再关机查看 alert 日志文件查看后台跟踪文件查看用户跟踪文件 检查数据库启动情况 ps -ef | grep oracle ipcs clear…

ROS2简介与Ubuntu24.04中安装指南

之前安装了一个版本,但是不愿意写blog,现在想想自己就是个沙子立个flag,每次配置项目,写流程blog ROS简介 ROS(Robot Operating System)是一个开源的机器人软件平台,提供了许多工具和库来帮助…

【Linux】- vim四种模式常见使用技巧

目录 一、快速认识vim 1、概念: 2、vim的四种模式及其互相转换 二、常见模式具体介绍 1、命令模式 2、底行模式 3、小技巧 一、快速认识vim 1、概念: vim是一个多模式的编辑器,vim里面还有很多的子命令,来进行代码的编写操…

Rust 力扣 - 1652. 拆炸弹

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要遍历长度长度为k的窗口&#xff0c;然后把窗口内数字之和填充到结果数组中的对应位置即可 题解代码 impl Solution {pub fn decrypt(code: Vec<i32>, k: i32) -> Vec<i32> {let n c…

基于springboot的高校科研管理系统(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题&#xff0c;今天给…