【数据结构】二叉树详解(3)

⭐️ 前言

✨ 往期链接:【数据结构】二叉树详解(1)
在第一篇二叉树文章中,我们探讨了二叉树的链式结构定义与实现。二叉的遍历包含( 前序/中序/后序遍历 )及代码实现和递归流程图的详细讲解。还有一些二叉树的其他接口定义与实现,包含 BinaryTreeSize ( 计算二叉树结点的数量 )、BinaryTreeLeafSize( 计算二叉树叶子结点的数量 )、BinaryTreeKLevelSize( 计算二叉树第 k k k 层节点的个数 )、BinaryTreeFind( 二叉树中查找某个元素 )。
在这里插入图片描述


在这里插入图片描述


✨ 往期链接:【数据结构】二叉树详解(2)
在第二篇二叉树文章中,又是在第一篇的基础上又补充了一个接口的实现BinaryTreeDepth( 计算二叉树的深度 )
在这里插入图片描述


本期我们在前两篇的基础上,继续补充一些关于二叉树的其他接口实现。

⭐️ 二叉树的其他接口

// 二叉树的销毁
void BinaryTreeDestroy(BinaryTreeNode* root);
// 二叉树层序遍历(需要队列)
void LevelOrder(BinaryTreeNode* root);
// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BinaryTreeNode* root);

BinaryTreeDestroy 实现:

// 二叉树的销毁
// 后序遍历最优
void BinaryTreeDestroy(BinaryTreeNode* root) {
	if (root == NULL) {
		return;
	}

	BinaryTreeDestroy(root->left);
	BinaryTreeDestroy(root->right);

	free(root);
}

解析: 二叉树的销毁采用后序遍历是最优的,先销毁左子树在销毁右子树最后销毁根节点。


LevelOrder 实现:

// 二叉树层序遍历(需要队列)
void LevelOrder(BinaryTreeNode* root) {
	Queue q;
	QueueInit(&q);

	// 把根节点入队列
	if (root) {
		QueuePush(&q , root);
	}

	// 依次遍历队列
	while (!QueueIsEmpty(&q)) {
		// 取出队头节点
		QueueDataType front = QueueFront(&q);
		// 出队头节点
		QueuePop(&q);
		// 打印
		printf("%d " , front->value);
		// 左节点不为空 入队列
		if (front->left) {
			QueuePush(&q , front->left);
		}
		// 右节点不为空 入队列
		if (front->right) {
			QueuePush(&q , front->right);
		}
	}

	QueueDestroy(&q);
}

解析: 层序遍历需要依靠队列来实现,思路是把根节点入队列,循环判断队列不为空,若队列不为空则把当前队头节点取出并把队头节点的左右孩子依次入队,再删除队头数据。队列的代码以及实现:✨ 往期文章:【数据结构】栈和队列实现

在这里插入图片描述


BinaryTreeComplete 实现:

// 判断二叉树是否是完全二叉树
// 用到层序遍历的思想
bool BinaryTreeComplete(BinaryTreeNode* root) {
	Queue q;
	QueueInit(&q);
	// 根节点不为空入队列
	if (root) {
		QueuePush(&q , root);
	}
	// 检查队列
	while (!QueueIsEmpty(&q)) {
		// 取出队头数据
		QueueDataType front = QueueFront(&q);
		// 删除队头数据
		QueuePop(&q);
		// 如果当前对头节点存在则让当前节点左右节点入队
		if (front) {
			QueuePush(&q , front->left);
			QueuePush(&q, front->right);
		}
		else {
			break;
		}
	}
	// 继续检查队列
	// 如果全为空 则是完全二叉树
	// 如果有一个不为空 则不是完全二叉树
	while (!QueueIsEmpty(&q)) {
		QueueDataType front = QueueFront(&q);
		QueuePop(&q);
		if (front) {
			QueueDestroy(&q);
			return false;
		}
	}

	QueueDestroy(&q);
	return true;
}

解析: 判断当前二叉树是否是完全二叉树,使用到了层序遍历的思想。层序遍历是把根节点入队列,再依次检查队列是否为空,若不为空则取出队头数据,再判断子孩子是否存在,当把当前根节点出队列时,再将子孩子节点入队列,直至队列为空。完全二叉树满足 k − 1 k - 1 k1 层节点是满的,最后一层节点最少只有一个,最多也是满的(这种情况也叫做满二叉树)。当然完全二叉树最后一层节点之间还需要是连续的。
在这里插入图片描述


从上图可知:如果不是完全二叉树,当遇到第一个 NULL 时队列后面还有非空节点则就不是完全二叉树。因为完全二叉树的层序遍历是使存在的节点都在左侧 NULL节点都在右侧。所以我们在层序遍历的基础上把空节点也依次入队, 当碰到第一个 NULL 节点结束循环,再依次检查队列剩余的节点中是否有不为 NULL 的节点,若都为 NULL 则当前二叉树就是完全二叉树,若有非 NULL 节点,则当前就不是完全二叉树。

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

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

相关文章

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构,因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例,供参考: your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法(Pa…

ubuntu 18.04 磁盘太满无法进入系统

安装了一个压缩包,装了一半提示磁盘空间少导致安装失败。我也没在意,退出虚拟机打算扩展硬盘。等我在虚拟机设置中完成扩展操作,准备进入虚拟机内部进行操作时,发现登录不进去了 shift 登入GUN GRUB设置项的问题 网上都是在开机…

持续贡献开源力量,棱镜七彩加入openKylin

近日,棱镜七彩签署 openKylin 社区 CLA(Contributor License Agreement 贡献者许可协议),正式加入openKylin 开源社区。 棱镜七彩成立于2016年,是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

Cesium态势标绘专题-圆角矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

剑指offer41.数据流中的中位数

我一开始的想法是既然要找中位数,那肯定要排序,而且这个数据结构肯定要能动态的添加数据的,肯定不能用数组,于是我想到了用优先队列,它自己会排序都不用我写,所以addNum方法直接调用就可以,但是…

小创业公司死亡剧本

感觉蛮真实的;很多小创业公司没有阿里华为的命,却得了阿里华为的病。小的创业公司要想活无非以下几点: 1 现金流,现金流,现金流; 2 产品,找痛点,不要搞伪需求; 3 根据公司…

让婚礼策划展示小程序成为你的必备利器

在当今互联网时代,微信小程序已经成为了很多企业和个人展示自己产品和服务的重要渠道。如果你想学习微信小程序开发,下面将为你介绍一些基本步骤。 首先,你需要注册并登录一个第三方小程序制作平台,比如乔拓云平台。这些平台提供了…

Git-分布式版本控制工具

Git仓库:本地和远程 获取git仓库: 本地初始化Git仓库(创建空目录,右键git bansh,执行git init)远程仓库克隆,git clone 远程仓库地址 版本库:.git隐藏文件夹,储存配置信…

【SCI一区】互联燃料电池混合动力汽车通过信号交叉口的生态驾驶双层凸优化(Matlab代码实现)

目录 💥1 概述 1.2 电动车动力学方程 1.3 电池模型 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章讲解 💥1 概述 文献来源: 随着车辆互联性的出现,互联汽车 (CVs) 在增强道路安全、改…

Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放

技术诉求 我们在做GB28181设备对接模块和RTMP直播推送模块的时候,遇到这样的技术需求,设备(如执法记录仪)侧除了采集传统的摄像头外,还需要对接比如大疆等第三方数据源,确保按照GB28181规范和RTMP协议规范…

量化交易——python数据分析及可视化

该项目分为两个部分:一是数据计算,二是可视化,三是MACD策略 一、计算MACD 1、数据部分 数据来源:tushare 数据字段包含:日期,开盘价,收盘价,最低价,最高价&#xff0c…

C# 用队列实现栈

225 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返…

数分面试题-SQL常见面试题型1

目录标题 1、连续时间问题1.1 最近一周内的活跃天数1.2 每个用户一周内最大连续活跃天数1.3 计算截至当前,每个用户已经连续签到的天数 2、时间间隔问题举例3、sql窗口分析函数3.1 有一个日志登陆列表,获取用户在某个页面停留时长3.2 寻找至少连续出现3次…

苍穹外卖-day08 java实现 微信支付

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现:用户下单、订单支付 用户下单效果图: 订单支付效果图: 1. 导入地址簿功能代码 1.1 需求分析和设计 1.1.1 产品原型 地址簿,指的是消费者用户的地址信息&…

GPT-3.5:ChatGPT的奇妙之处和革命性进步

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

从小白到大神之路之学习运维第67天-------Tomcat应用服务 WEB服务

第三阶段基础 时 间:2023年7月25日 参加人:全班人员 内 容: Tomcat应用服务 WEB服务 目录 一、中间件产品介绍 二、Tomcat软件简介 三、Tomcat应用场景 四、安装配置Tomcat 五、配置目录及文件说明 (一)to…

【Java】Java多线程编程基础

文章目录 1. 进程与线程1.1 进程与线程的基本认识1.1.1 进程(Process)1.1.2 线程(Thread) 1.2 为什么会有线程1.2.1 以看视频为例 2. 多线程实现2.1 Thread类实现多线程2.2 Runnable接口实现多线程2.3 Callable接口实现多线程2.3 …

Oracle输出文本平面(CSV、XML)文本数据详细过程

此过程是提供给前端,调用的接口,为报表提供”下载“功能。以下是本人在测试环境的测试,有什么不足的地方,请留言指教,谢谢。 1、测试表 分别对测试表输出csv、xml两种格式文件数据。前期的准备工作。 --在服务器端创建directory,用管理员用户 create or replace directo…

win10计算器无法打开

问题背景: 打开计算器报错,显示无法打开应用,请打开应用商店获取更多信息。 解决过程 网上试了很多方法,看的最多的是 1、点开计算器重置应用 2、输入命令重新安装 。。。。。。。 说实话都没解决 最后看到这三个图标后,突然…