110.【C语言】数据结构之判断是否为完全二叉树

news/2024/12/16 13:42:15/

目录

1.知识回顾

2.分析

完全二叉树队列示意图

 非完全二叉树队列示意图

区别

3.代码

执行过程

完整代码

运行结果


1.知识回顾

完全二叉树和非完全二叉树参见100.【C语言】数据结构之二叉树的基本知识文章

2.分析

使用层序遍历(队列),核心思想参见109.【C语言】数据结构之二叉树层序遍历文章

这里对比完全二叉树和非完全二叉树在层序遍历中的区别

注意:和以往的层序遍历有所不同,空节点也要push(push它的地址NULL)

完全二叉树队列示意图

 非完全二叉树队列示意图

区别

当两个队列的队头为NULL时,观察两个队列之间的区别

完全二叉树:元素全为空

非完全二叉树:有非空元素

可以此来判断是否为完全二叉树

3.代码

执行过程

初始化队列-->非空树,将根节点的地址入队-->层序遍历+出栈+入栈-->对队头的值判断(为NULL则一直出队,遇到非空则销毁队列+返回false)

层序遍历+出栈+入栈

根节点出栈,出栈前需要保留根节点的地址,以便于左右节点入栈(front->left和front->right,不是root->left和root->right)

大概的结构

		BTNode* front = QueueFront(&q);QueuePop(&q);QueuePush(&q,front->left);QueuePush(&q,front->right);

疑问1:不是对根节点的左右节点入栈吗?为什么不写成root->left和root->right呢?
root一直是整个二叉树根节点的地址,导致root->left和root->right的值一直没有变化,导致死循环

如果写成front->left和front->right,每次循环时,front的值会改变(依据队头的值进行调整)

	while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL) break;QueuePush(&q,front->left);QueuePush(&q,front->right);}

最终当队头为NULL时,退出循环

疑问2:第一个while的部分能写成下面这两种吗?

BTNode* front = QueueFront(&q);
while (1)
{front = QueueFront(&q);QueuePop(&q); if (front == NULL){break;}QueuePush(&q, front->left);QueuePush(&q, front->right);
}
	while (QueueFront(&q)){BTNode*  front = QueueFront(&q);QueuePop(&q); if (front == NULL){break;}QueuePush(&q, front->left);QueuePush(&q, front->right);}

两种写法均可以,while循环退出的唯一出口在if (front==NULL),由于NULL也入队,因此不存在队列为空的情况

完整代码

bool TreeComplete(BTNode* root)
{Queue q;QueueInit(&q);if (root)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){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;	
}

注意返回前养成好习惯,需要销毁队列

main.c写入

int main()
{BTNode* root = CreateTree();printf("TreeComplete:%d", TreeComplete(root));return 0;
}

备注:创建的二叉树的结构为

运行结果


http://www.ppmy.cn/news/1555597.html

相关文章

ArcGIS教程(007):制作中国行政区划图

文章目录 000:数据准备001:利用地理数据制作中国行政区划图000:数据准备 通过网盘分享的文件:ArcGIS教程(007):中国行政区划图教程练习数据.zip 链接: https://pan.baidu.com/s/1nMiRYD-dbv2S0DoeQzR87g?pwd=3535 提取码: 3535001:利用地理数据制作中国行政区划图 ne_…

【安卓开发】【Android Studio】启动时报错“Unable to access Android SDK add-on list”

一、问题描述 在启动Android Studio时,软件报错:Unable to access Android SDK add-on list,报错截图如下: 二、原因及解决方法 初步推测是由于网络节点延迟,无法接入谷歌导致的。点击Cancel取消即可。

Debezium OracleStreamingChangeEventSourceMetrics 分析

Debezium OracleStreamingChangeEventSourceMetrics 分析 目录 1. 概述2. 核心指标3. 实现分析4. 使用场景5. 监控示例6. 最佳实践7. 总结1. 概述 OracleStreamingChangeEventSourceMetrics 是 Debezium Oracle 连接器中的度量指标收集组件,主要负责: 收集连接器运行时的各…

Linux更改远程默认SSL端口

1、登录Linux服务器 2、编辑ssh服务配置文件:vi /etc/ssh/sshd_config 光标移至“#Port 22”位置,按“i”进入编辑模式,然后键盘按一下回车键,新增一行 Port 2022 编辑好,先按ESC键,再输入:wq 保存退出.&…

使用create-react-app创建工程时报错处理

1:全局安装create-react-app npm install -g create-react-app 2:切换到项目要创建的目录下 cd /d G:\vsCode_project\react 3:使用脚手架命令创建工程 create-react-app 项目名 项目名命名要遵循npm包命名规范:数字、小写字…

关闭vmware提示 - 在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能。虚拟设备“serial0“将开始断开连接。

效果图 实现步骤 虚拟操作系统关机编辑虚拟机设置 → 打印机 → 移除​​​​​​​ →​​​​​​​ 确定成功关闭提示效果

React基础学习

React基础 📣 📣 📣 📢📢📢 ☀️☀️点开就是缘分认识一下,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#x…

crapy 爬虫框架的使用

1.scrapy框架安装 安装前先安装python3和pycharm 社区版 执行命令安装scrapy, pip install scrapy 2.创建项目 执行命令: scrapy startproject test_spider 如图: 3.使用pycharm大开项目并设置pipenv虚拟机环境 虚拟环境是为了依赖隔…