判断完全二叉树(层序遍历)| C

news2024/10/7 6:48:06

层序遍历

基本思路:利用队列,出上一层,带下一层(NULL不入队列)
(C语言需要自己构建队列→【队列】<用链表实现队列> | [数据结构] | C语言)
在这里插入图片描述

在这里插入图片描述

代码

#include "Queue.h"

typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;

void BinaryTreeLevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);//初始化队列
	
	if (root)
		QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		QDataType front = QueueFront(&q);
		printf("%c ", front->_data);

		QueuePop(&q);//出一层
		//带下一层
		if (front->_left)
			QueuePush(&q, front->_left);
		if (front->_right)
			QueuePush(&q, front->_right);
	}

	QueueDestroy(&q);//销毁队列
}

判断完全二叉树

分步讲解

思路:层序遍历二叉树,不同的是 NULL 也要入队列。

完全二叉树出现 NULL 后面 应该全部都是 NULL

以下以一个非完全二叉树展示
在这里插入图片描述
上图展示的循环过程为:

QueuePush(&q, root);
while (!QueueEmpty(&q))
{
	QDataType front = QueueFront(&q);

	QueuePop(&q);//出一层
	if (!front)//队头遇到NULL跳出循环
	{
		break;
	}
	else
	{
		//带下一层(不管是不是空,都先把下一层放进去)
		QueuePush(&q, front->_left);
		QueuePush(&q, front->_right);

	}
}
  • 当队头遇到NULL,不再进行入队列,而进把队列中还剩的结点依次pop出去,这个过程中如果当遇到 非NULL 就意味着该二叉树不是完全二叉树return 0(return之后函数就结束了!开辟的空间不要忘记Destroy!)(如果把函数的返回值设为bool,就return false)
  • 如果一直走到队列为空,则该二叉树是完全二叉树
while (!QueueEmpty(&q))
{
	QDataType front = QueueFront(&q);
	QueuePop(&q);//出一层

	if (!front)
	{
		QueueDestroy(&q);//ps.开辟的空间不要忘记Destroy!
		return 0;
	}
}
QueueDestroy(&q);
return 1;

完整代码

// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root)
{
	assert(root);
	//层序遍历,如果访问到NULL后面还有数据就不是完全二叉树
	Queue q;
	QueueInit(&q);
	if (root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		QDataType front = QueueFront(&q);

		QueuePop(&q);//出一层
		if (!front)//队头遇到NULL跳出循环
		{
			break;
		}
		else
		{
			//带下一层(不管是不是空,都先把下一层房间去)
			QueuePush(&q, front->_left);
			QueuePush(&q, front->_right);

		}
	}
	while (!QueueEmpty(&q))
	{
		QDataType front = QueueFront(&q);
		QueuePop(&q);//出一层

		if (!front)
		{
			QueueDestroy(&q);
			return 0;
		}
	}
	QueueDestroy(&q);

	return 1;
}

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

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

相关文章

代码自动发布系统

之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器 现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像 分析 旧∶ 代码发布环境提前准备,以主机为颗粒度静态 新: 代码发布环境多套,以容器为颗粒度编译 …

Typora设置修改字体颜色快捷键

目录 1.typora如何设置修改字体颜色快捷键 2. AutoHotKey软件安装 3.typora关于AutoHotKey的具体操作 1.typora如何设置修改字体颜色快捷键 typora本身是不能直接修改字体颜色的,不过若是想修改还是可以用一些代码去改变的,但是每次都修改一次实在麻烦…

mysql常用的基础命令

通过学习mysql命令提高数据处理和工作效率 基础命令 1.登录MySQL mysql -u root -p 2.查看当前系统所有数据库 show databases; 3.切换数据库 use 数据库名称 4.查看数据库下的所有表 show tables; 5.查看表结构; desc 表名; 6.创建数据库 crea…

MAC OS(M1)安装配置miniconda

一、下载安装miniconda miniconde官网:Miniconda — Conda documentation M1最低只能适配到python3.8 打开终端,进入安装包所在文件夹,使用命令进行安装 bash Miniconda3-latest-MacOSX-arm64.sh一路回车 二、配置环境 安装完成后重启终端&#xf…

Unity ads广告插件的使用

介绍 Unity Ads SDK 由领先的移动游戏引擎创建,无论您在 Unity、Xcode 还是 Android Studio 中进行开发,都能为您的游戏提供全面的货币化框架。 使用 Unity Ads 将各种广告格式合并到游戏中的自然呈现点中。例如,您可以实施激励视频广告来构建更强大的游戏经济,同时为您的…

[C++笔记]vector

vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样,vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问,和数组一样高效。与数组不同的是,它的大小可以动态改变——…

1700页,卷S人的 Java《八股文》PDF手册,涨薪跳槽拿高薪就靠它了

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

Mybatis一级缓存和二级缓存(带测试方法)

目录 一、什么是缓存 二、Mabtis一级缓存 (1)测试一级缓存 (2)清空一级缓存 三、Mybatis二级缓存 (1)开启二级缓存 (2)测试二级缓存 一、什么是缓存 缓存是内存当中一块存储数…

蓝桥杯嵌入式第十一届省赛题目解析

写完第十一届蓝桥杯嵌入式省赛题目,拿出来给大家参考参考,也是让大家一起测试看看有什么问题还需要改进,代码在最后喔。 目录 客观题: 程序设计题 : 题目解析: CubeMX配置 代码演示 : 客观…

Windows环境下实现设计模式——职责链模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现职责链模式(设计模式)。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff…

spring boot Websocket(使用笔记)

使用websocket有两种方式:1是使用sockjs,2是使用h5的标准。使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。 1、pom 核心是ServerEndpoint这个注解。这个注解是Javaee标准里的注解,tomcat7以上已经对其进行了实现&a…

学内核之十八:纸上得来终觉浅,绝知此事要躬行

目录 0 前言 1 ioremap、vmalloc与原子上下文 2 copy_to_user与进程上下文 3 fasync与指针初始化 4 wait_event_interruptible与条件变量 0 前言 大家都知道,内核开发跟应用开发,体验是完全不同的,尤其是驱动。一方面要掌握扎实的语言基…

MySQL 基本轮廓

目录 什么是数据库 主流数据库 基本使用 连接服务器 服务器管理 使用案例 创建数据库 使用数据库 创建数据库表 表中插入数据 查询表中的数据 服务器,数据库,表关系 MySQL架构 什么是数据库 存储数据用文件就可以了,为什么还要弄…

每日一问-ChapGPT-20230409-中医基础-四诊之望诊

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230409-中医基础-四诊之望诊中医中的望闻问切介绍,以及对应的名家望诊的具体细节望诊拓展当日总结每日一问-ChapGPT系列起因 近来看了新闻,看了各种媒体,抖音,官媒&#xff…

【数据库原理 • 四】数据库设计和规范化理论

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

jvm调优一:从源码级别了解jvm类加载机制

目录 一、类加载运行全过程 类加载器加载类的过程 二、类加载器和双亲委派机制 类加载器类型 类加载器初始化过程 双亲委派机制 为什么要设计双亲委派机制? 全盘负责委托机制 一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c…

Kube-proxy 使用 iptables 模式时,通过 Service 服务发布入口如何到达 Pod ?

写在前面 被问到这个问题,整理相关的笔记当 kube-proxy 模式设置为 iptables 的时候,通过 SVC 服务发布入口如何到达 Pod?博文内容涉及: 问题简单介绍三种常用的服务发布方式到Pod报文路径解析 当前集群为版本为v1.25.1Demo 演示使…

linux内核结构以及内核模块编程

1、linux内核结构 1.1、单内核与微内核结构 1.1.1、什么是单内核结构和微内核结构 linux操作系统是一个单内核的结构,它的各个子系统之间可以直接调用 比如说文件系统、内存管理、进程管理以及网络系统和进程间通信它们互相之间可以直接调用只有一些核心的代码它…

记录npm的安装过程

一、访问官网(https://nodejs.org/en),下载nodejs并安装: 然后一路点击next直到安装完成,环境变量已经自动添加好了: 通过设置环境变量,改变本地仓库地址: 可以看到,…

一条更新语句的执行流程又是怎样的呢?

当一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表T上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。 接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用ID这个索引。然…