数据结构之链式结构二叉树的实现(进阶版)

本篇文章主要讲解链式二叉树的层序遍历以及判断是否为一棵完全二叉树

二者将会用到之前学过的队列知识,是将队列和二叉树的整合

一、如何将之前已经写好的文件加入当前的编译界面

如图所示,打开我们需要加入文件所在的文件夹,找到我们要加入的文件,按ctrl+c将其复制下来,在本文中,我们需要将queue.h和queue.c复制下来.

然后在找到我们当前文件所在的文件夹,将其粘贴进去,如图所示

 

之后在vs的解决方案栏中找到 头文件,右键,添加,现有项,进入这个界面

长按ctrl并且鼠标左键选择queue.h和queue.c,之后点添加,之后这个栏是这样的

此时在鼠标左键按住queue.c文件,拖到源文件处即可

好了,前提条件已经具备了,下面准备写代码了

二、层序遍历及判断完全二叉树

这里由于我们是要将二叉树的各个结点入队列,所以前面的typedef应该改一下

queue文件基本上不需要改动!

接下来我们将实现 层序遍历及判断完全二叉树,这里仅展示与其相关的代码,其余的代码前往上一篇文章查看!

这是tree.h文件

// 层序遍历
void LevelOrder(btnode* root);
// 判断⼆叉树是否是完全⼆叉树
bool BinaryTreeComplete(btnode* root);

这是tree.c文件

#include"queue.h"
//层序遍历
void LevelOrder(btnode* root)
{queue q;queueinit(&q);queuepush(&q, root);while (!queueempty(&q)){//取队头,出队头btnode* top = queuefront(&q);queuepop(&q);printf("%c", top->data);        //注意不要写成%d!!!!!//将队头的左右孩子入队列(不为空)if (top->left){queuepush(&q, top->left);}if (top->right){queuepush(&q, top->right);}}queuedestroy(&q);
}
//判断二叉树是否为完全二叉树
bool BinaryTreeComplete(btnode* root)
{queue q;queueinit(&q);queuepush(&q,root);while (!queueempty(&q)){//取队头,出队头btnode* top = queuefront(&q);queuepop(&q);if (top == NULL){ //只要取到空结点就跳出while循环break;}//把不为空的头结点的左右孩子入队列queuepush(&q, top->left);queuepush(&q, top->right);}//此时队列可能为空,也可能不为空,故继续取,若取到不为空的结点,则证明不是完全二叉树while (!queueempty(&q)){btnode* top = queuefront(&q);queuepop(&q);if (top != NULL){queuedestroy(&q);return false;}}queuedestroy(&q);return true;
}

这是test.c文件

	//层序遍历LevelOrder(root);printf("\n");//判断是否为完全二叉树if (BinaryTreeComplete(root)){printf("It is a complete binary tree!");}else{printf("It is not a complete binary tree!");}BinaryTreeDestory(&root);

运行结果附上:
 

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

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

相关文章

StructRAG简介

StructRAG是一种新型的框架,旨在提升大型语言模型(LLMs)在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制,根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…

Windows Server NTFS磁盘变RAM的处理过程

问题描述 客户服务器的磁盘数据爆满,需要将磁盘进行扩容,因为是虚拟机所以先在虚拟化平台上将原来的磁盘空间改大,再进入系统,在磁盘管理器上将需要扩容的磁盘进行扩展。扩展完后系统报文件系统有问题,扩容的磁盘容量…

如何让反向代购客户享受丝滑般的下单之旅?

想象一下,一键下单,轻松购物,仿佛穿越时空的魔法,让中国好货瞬间触手可及!从made in china的美妆神器到潮流服饰,从尖端数码产品到温馨家居用品,从令人垂涎的美食到贴心的母婴用品,这…

解决Selenium的3大痛点!这款工具让你的自动化测试效率翻倍!

相信使用过Selenium WebDriver的小伙伴对其最大的诟病有3点,一是浏览器的driver和版本对应问题,第二是Selenium的执行速度,最后一个槽点是对页面元素文本值的断言非常不便。 在我们长期维护大量UI自动化测试用例的过程中这些痛点会让我们耗费…

5G基础知识

什么是 FDD 频分双工(Frequency Division Duplexing),理解起来很简单,就是把上行和下行业务隔离在两个频段,互不干扰。 而 TDD 时分双工(Time-Division Duplexing),是指上行下业务完…

使用 Elastic Observability 监控 dbt 管道

作者:来自 Elastic Almudena Sanz Oliv•Tamara Dancheva 了解如何使用 Elastic 设置 dbt 监控系统,该系统可主动发出数据处理成本峰值、每张表的行数异常以及数据质量测试失败的警报。 在 Elastic 可观察性组织内的数据分析团队中,我们使用 …

网站攻击,XSS攻击的类型

XSS(跨站脚本)攻击是一种网络安全攻击方式,攻击者通过在网站页面中注入恶意脚本,使脚本在其他用户的浏览器中执行,从而窃取用户信息、篡改页面内容或操控用户账户。这类攻击通常利用网站对输入数据的过滤不严格&#x…

2023年信息安全工程师摸底测试卷

目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务​编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …

linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件, 我们可以为总线添加额外的信息和控制选项, 以便与设备和驱动进行交互。 简单就是,属性文件,可以完成用户空间和内核空间的数据交互, 比如在应用层快速修改g…

R向量运算数组矩阵

向量的运算 向量的加减乘除可以直接进运行,不用循环 向量之间的运算:分别对应计算,不用循环 两个运算的向量可以不是长度相等,但是一定长度要成整数倍。 每种运算都可以返回逻辑值T或F 取整函数 保留小数位用round: …

[Python学习日记-54] Python 中的日志模块 —— logging

[Python学习日记-54] Python 中的日志模块 —— logging 简介 基础用法 日志写入到文件 自定义日志格式 日志同时输出到屏幕和写入到文件 简介 在程序的运行过程中会执行很多操作或者进行很多的交互,也有的时候可能你开发出来的网站会遭到黑客的攻击&#xff0…

C++关键字noexcept应用及案例

文章目录 使用场景:注意事项: noexcept在C中的应用和重要性:与标准库的交互与异常安全相关的编程模式与C标准的关系与性能的关系示例代码 综合案例扩展后的代码新增功能解释异常安全性能优化 在C中, noexcept是一个关键字&#x…

STM32F103HAL库实现低功耗(睡眠模式、停止模式和待机模式)

STM32F103HAL库实现低功耗(睡眠模式、停止模式和待机模式) 1. STM32电源结构2. 电源管理器2.1 上电复位和掉电复位2.2 可编辑电压监测器(PVD) 3. 低功耗模式介绍3.1 睡眠模式3.2 停止模式3.3 待机模式 4. 低功耗相关寄存器5. 低功…

Windows: 如何实现CLIPTokenizer.from_pretrained`本地加载`stable-diffusion-2-1-base`

参考:https://blog.csdn.net/qq_38423499/article/details/137158458 https://github.com/VinAIResearch/Anti-DreamBooth?tabreadme-ov-file 联网下载没有问题: import osos.environ["HF_ENDPOINT"] "https://hf-mirror.com" i…

【vue】14.插槽:构建可复用组件的关键

今天看代码的时候碰到了插槽&#xff0c;有些看不懂&#xff0c;所以写下这篇文章&#xff0c;系统地梳理一下关于插槽的内容&#xff0c;也希望给大家带来一些帮助。 // 我碰到的插槽长这样 <template #default"scope">... </template> 一.什么是插槽…

camera和lidar外参标定

雷达和相机的外参标定&#xff08;外部参数标定&#xff09;指的是确定两者之间的旋转和平移关系&#xff0c;使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…

数据结构和算法-动态规划(3)-经典问题

动态规划常见问题 打家劫舍 题目 [力扣198] 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&…

深入理解Redis的四种模式

Redis是一个内存数据存储系统&#xff0c;支持多种不同的部署模式。以下是Redis的四种主要部署模式。 1、单机模式 单机模式是最简单的部署模式&#xff0c;Redis将数据存储在单个节点上。这个节点包括一个Redis进程和一个持久化存储。单机模式非常适合小型应用程序或者开发和…

Flutter实战短视频课程

1、课程导学 一套代研运行多蜡 体州一致&#xff0c;目胜能优昇 未来大趋势 不改交原生项目的基础上&#xff0c;扩展Flutter能力 Flutter原生灵话切涣 0入侵 最简单、最通用 最新Flutter 3,x新特性讲解 大量flutter官方组件和api学习 最常用的第三方库使用及原理解析 自研组…

消息队列-Rabbitmq(消息发送,消息接收)

将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议&#xff0c;因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息&#xff0c;都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不…