层序遍历的应用——判断二叉树是否为完全二叉树

news2024/10/5 12:59:45

思维导图:

 一,完全二叉树的特点

假如我们现在有一颗完全二叉树,那它应该长什么样呢?

它应该长这样:

这样:                                                                 

这样:

如果不是一颗完全二叉树该长什么样呢?

应该长这样:

这样:

这样:

通过这几个图的对比可以看出完全二叉树与非完全二叉树的区别以及判断的方法:

1.假如一棵二叉树是完全二叉树的话,那这棵树一定符合:

      1.前h-1层是一个满二叉树。

      2.最后一层从左到右只能在最右边出现空节点。

2.完全二叉树的一个特征:

     如果一颗二叉树是完全二叉树那在这棵二叉树中度为1的节点个数只能为1.

二,使用层序遍历来判断的依据

层序遍历的遍历逻辑便是出一层出队列然后带下一城入队列。层序遍历的代码便长这样:

void LevelOrder(BTreeNode* root)
{
	Queue pq;//创建队列
	QueueInit(&pq);//初始化队列
	if (isEmpty(&pq))
	{
		QueuePush(&pq, root);//往队列中插入树节点
	}
	while (!isEmpty(&pq))
	{
		BTreeNode* front = QueueFront(&pq);
		printf("%d->", front->val);
		QueuePop(&pq);//出队列

		if (front->left)
			QueuePush(&pq, front->left);//入下一层树节点
		if (front->right)
			QueuePush(&pq, front->right);
	}
	QueueDestory(&pq);//销毁队列
	
} 

但这个代码却并不能够直接拿来判断一颗二叉树是否为完全二叉树。所以我们得对这个代码进行改造来实现判断的功能。现在我改造的代码如下:

 代码:

bool CompleteBTree(BTreeNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!isEmpty(&q))
	{
		BTreeNode* front = QueueFront(&q);
		QueuePop(&q);
        //当该节点为NULL时就跳出该循环到下一循环进行判断
		if (front == NULL)
			break;
        //当树节点的某一子节点为NULL时也需要插入队列中
		QueuePush(&q,front->left);
		QueuePush(&q,front->right);
		
	}
	while (!isEmpty(&q))
	{
		BTreeNode* front = QueueFront(&q);
		QueuePop(&q);
        //若该队列中的元素不完全是NULL节点那这棵二叉树就不是完全二叉树
		if (front)
		{
            QueueDestory(&q);
			return false;
		
		}
	}
	QueueDestory(&q);
	return true;
}

  1.   在写这个判断的函数时我主要按照层序遍历的代码改了几处地方,第一处便是这里:

if (front == NULL)
			break;

因为我们要判断的是完全二叉树,所以NULL节点只能在最后一层出现。所以当该二叉树为完全二叉树时并且出现了NULL的节点那该节点所在层就是最后一层(即使不是也要默认是最后一层)。

2.第二处便是添加了一个判断条件。代码如下:

while (!isEmpty(&q))
	{
		BTreeNode* front = QueueFront(&q);
		QueuePop(&q);
        //若该队列中的元素不完全是NULL节点那这棵二叉树就不是完全二叉树
		if (front)
		{
            QueueDestory(&q);
			return false;
		
		}
	}
    QueueDestory(&q);
	return true;

这段代码的作用就是对跳出来后的队列内的元素进行分析,假如这个队列里面出现了不是NULL的节点,那这棵二叉树便不是完全二叉树。

三,算法实现图解 

现在我们利用这个判断代码对这棵二叉树:

 先说结论:这不是一颗完全二叉树。

那在代码中是怎么走的呢?

代码图解:

这个图便表示的是代码:

while (!isEmpty(&q))
	{
		BTreeNode* front = QueueFront(&q);
		QueuePop(&q);
        //当该节点为NULL时就跳出该循环到下一循环进行判断
		if (front == NULL)
			break;
        //当树节点的某一子节点为NULL时也需要插入队列中
		QueuePush(&q,front->left);
		QueuePush(&q,front->right);
		
	}

走的过程以及执行的操作。当这段代码走完以后,队列就变成了这样:

然后使用代码:

while (!isEmpty(&q))
	{
		BTreeNode* front = QueueFront(&q);
		QueuePop(&q);
        //若该队列中的元素不完全是NULL节点那这棵二叉树就不是完全二叉树
		if (front)
		{
            QueueDestory(&q);
			return false;
		
		}
	}
    QueueDestory(&q);
	return true;

 进行判断,在走第二次循环的时候front = 4这个节点的地址为true。所以代码:

if (front)
		{
            QueueDestory(&q);
			return false;
		
		}

 执行,返回false。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6 种方式读取 Springboot 的配置,老鸟都这么玩(原理+实战)

大家好,我是小富~ 从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑。 我整理了几种获取配置属性的方式,目的不仅是要让大家学会如何使用&#…

Exiv2 —— exiv2介绍及下载搭建环境(Vs2017)

Exiv2介绍 Exiv2 是一个跨平台C库和一个命令行实用程序,用于管理图像元数据。它提供对Exif,IPTC和XMP元数据以及ICC配置文件的快速简便的读写访问。 嵌入到各种格式的数字图像中。 Exiv2 作为免费软件提供,用于许多项目 包括KDE和Gnome Deskt…

chatgpt赋能python:Python自动化脚本编写——让工作更高效

Python自动化脚本编写——让工作更高效 在当今的工作中,自动化脚本已经成为了一个不可或缺的工具。而Python作为一门脚本语言,它的开源、易用以及强大的库使得它成为了很多人使用自动化脚本的首选语言。 在本文中,我们将会探讨如何使用Pyth…

ChatGPT 指南:角色扮演让回答问题更专业

让 ChatGPT 进行角色扮演 Act as ...,比如,律师、内科医生、心理医生、运动教练、哲学家、翻译、平面设计师、IT 工程师等等,从而才能让 ChatGPT 从这个角色角度来分析我们的问题,不然,它的回答可能会过于广泛。 下面以…

Vue中如何进行自动化测试与端到端测试(E2E测试)

Vue中如何进行自动化测试与端到端测试(E2E测试) Vue.js是一种流行的前端JavaScript框架,用于构建现代的单页应用程序。在Vue.js中,测试是一个非常重要的主题。测试可以确保代码的正确性,使代码更加可靠和可维护。在这…

p-tuing和Lora的区别

一、前言 自从chatgpt的爆火,也同时引发了国内大模型的热潮,像百度出了文心一言、阿里出了通义千问等,但是这些大模型并未开源,国内外开源的中等规模的模型有meta的LLaMA,斯坦福基于LLaMA微调的Alpaca,国内…

小程序开发的前沿趋势和技术

在过去的一年里,小程序已成为移动互联网行业最热门的话题之一。小程序已经改变了许多行业。那么,下一个小程序开发趋势是什么?下面我们就来分析一下。 随着微信小程序的开放和推广,小程序开发企业正在大力发展并逐渐从技术方面进…

【2023最新版】黑客零基础入门(全网最全)从零基础到进阶,学完这一篇就够了

学前感言 1.这是一条需要坚持的道路,如果你只有三分钟的热情那么可以放弃往下看了。2.多练多想,不要离开了教程什么都不会,最好看完教程自己独立完成技术方面的开发。3.有问题多google,baidu…我们往往都遇不到好心的大神,谁会无…

【Qt】使用libmodbus实现ModBusTcp

这里写目录标题 下载编译使用DemoQModbusTcpClient Demo:参照:Qt自带QModbusTcpClient,换个电脑就不好使了,换libmodbus 下载 可以去github下载 链接: https://pan.baidu.com/s/13lgEZ59Dt5M7zmTJNpfKvg?pwd=yzfm 提取码: yzfm 下载libmodbus 并解压 编译 进入该目录下…

智造零距离:工程师走访华秋深圳 PCB 工厂,观摩高可靠板制造流程

6月11日,来自硬十、是德、灵明光子、兆易创新、汇顶科技、中诺通讯等公司的近20位工程师走访了华秋深圳PCB工厂。华秋工艺经理余宁带领考察团参观了工厂的生产线,近距离观摩了PCB的制造流程。 参观环节正式开始前,工厂安排专家介绍PCB制造的详…

SpringBatch从入门到实战(四):执行上下文和单步骤重启

一:执行上下文 1.1 JobContext 作业上下文 JobContext 绑定 JobExecution 执行对象,为Job作业执行提供执行环境(上下文)。 1.2 StepContext 步骤上下文 StepContext 绑定 StepExecution 执行对象,为Step步骤执行提供执行环境(上下文)。 1…

Ansible playbook ----- 剧本

playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables:变量 (3)Templates:模…

Ubuntu 20.04 LTS 安装教程

Ubuntu 20.04 LTS 以及必要软件的安装教程 1、Ubuntu 系统下载2、制作U盘安装盘3、安装Ubuntu系统4、必要软件安装4.1、调整系统时间4.2、安装搜狗中文输入法4.3、anaconda 安装4.4、安装 terminator4.4、安装 nvidia 驱动 1、Ubuntu 系统下载 官方桌面版下载:https…

电力监控系统软件的设计与功能介绍

安科瑞虞佳豪 风吹麦浪,炎夏将至。随着气温节节攀升,社会用电需求越来越大,给电网安全和电力供应带来挑战。国网诸城市供电公司扛牢电力保供责任,迎难而上,筑牢强电网、保安全、防大汛“三部曲”,全力保障…

数据库优化可以从哪些维度入手?(建议收藏)

当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。 当然这不能算是完全错误的回答,只不过思考的角度稍微片面了些,太“…

还在争论WPS、Office哪个更好用?3款云办公平台深度评测!

随着当下智能化产业发展,办公系统也逐渐升级。像答主所在公司就已经使用了简道云办公平台,真正实现无纸化办公,极大地提升了工作效率。什么是云办公平台;相较于传统办公平台,云办公平台又哪些独特的优势呢,…

Vue-props配置

props配置 像el,data,watch,methods…都是vue的配置项,props也是一个配置项 props主要用来实现组件复用,并且动态绑定数据,它有3种使用方式,下面一一说明 通过案例进行分析使用props配置学习如何使用以及…

手写STM32IIC协议

本文使用正点原子战舰v4开发板,用软件模拟iic协议而非使用硬件iic。 STEP1: 定义、声明引脚功能。我们用PB6、PB7模拟IIC的SCL、SDA。另外定义IO方向 #define IIC_SCL PBout(6) //SCL #define IIC_SDA PBout(7) //SDA #define READ_SDA PBin(7…

chatgpt赋能python:Python绘制彩色蟒蛇-让你的绘图更加有趣

Python绘制彩色蟒蛇-让你的绘图更加有趣 如果你是一名喜欢使用Python语言进行绘图的程序员,你可能会遇到无聊的绘图任务,这时候你就需要一个有趣的绘图项目来激发你的创造力。在本文中,我将介绍如何使用Python代码绘制一条彩色的蟒蛇&#x…

Unity与Android交互(3)——需要了解的Andorid基础知识

【前言】 在上一篇文章中只是说了如何实现unity和android交互的问题,要了解其中的原理还必须要先了解一些Android的基础知识,了解后也能搞清楚如何接入SDK或者写Native插件。 (以下只是简要介绍,详细的内容需要自己去看链接&…