DS链式二叉树的遍历(11)

文章目录

  • 前言
  • 一、链式二叉树的结构
    • 结构定义
    • 手动搭建
  • 二、二叉树的遍历
    • 三种常见遍历(前序、中序、后序)
    • 层序遍历
  • 总结


前言

  堆是特殊的二叉树,可二叉树本身也很值得研究~
  正文开始!


一、链式二叉树的结构

  前文也提到了二叉树一共有两种,空树与非空,且用递归定义
在这里插入图片描述

结构定义

typedef int BTDataType;//定义数据类型,可以根据需要更改typedef struct BinaryTreeNode
{BTDataType data;				//存储数据struct BinaryTreeNode* left;	//左指针struct BinaryTreeNode* right;	//右指针
}BTNode;

手动搭建

 为了方便我们更快地学习二叉树的结构和基本操作,这里直接手动搭建一颗二叉树。不仅如此,在做二叉树相关题目时,由于部分原因做题平台不支持普通用户使用调试功能,可以快速搭建二叉树在本地编译器上进行调试相关操作
在这里插入图片描述

BTNode* BuyNode(BTDataType x)
{BTNode* tmp = (BTNode*)malloc(sizeof(BTNode));if (tmp == NULL){perror("malloc fail!");exit(-1);}; tmp->data = x;tmp->left = NULL;tmp->right = NULL;return tmp;
}BTNode* CreatBinaryTree()
{BTNode* n1 = BuyNode(1);BTNode* n2 = BuyNode(2);BTNode* n3 = BuyNode(3);BTNode* n4 = BuyNode(4);BTNode* n5 = BuyNode(5);BTNode* n6 = BuyNode(6);n1->left = n2;n1->right = n3;n2->left = n4;n2->right = n5;n3->left = n6;return n1;
}

二、二叉树的遍历

  学习二叉树的结构,最简单的方式就是遍历,遍历是二叉树上最重要的运算之一,也是二叉树上进行其他运算的基础。二叉树遍历按照某种特定的规则,依次对二叉树中的节点进行对应的操作,并且每个节点只操作一次
在这里插入图片描述

三种常见遍历(前序、中序、后序)

 根据规定,访问顺序左子树是先于右子树,导致了二叉树遍历有三种递归式结构前序/中序/后序的遍历,被访问节点必是某子树的根。根据英文缩写可以通过N、L、R表示根、左子树、右子树,对此NLR、LNR和LRN称为先根遍历、中根遍历和后根遍历
在这里插入图片描述

你可以尝试一下用三种遍历方式并写出访问顺序(空也会访问,用N代表)

在这里插入图片描述

前序:123NNN45NN6NN
中序:N3N2N1N5N4N6N
后序:NN3N2NN5NN641

我就以前序遍历为例子,给出递归的过程:
 达到1号节点为根,访问左子树;达到2号节点为根;访问左子树;达到3号节点为根;访问左子树;达到为空位置返回,访问根(3号),访问右子树;达到空位置,以3号为根子树访问完;以2号为根左子树访问完,访问根(2号),以此类推直到遍历完毕

在这里插入图片描述

层序遍历

 设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历
在这里插入图片描述
思路也很明确:

  1. 先将根节点入队,然后开始从队头出数据
  2. 出队头的数据同时将队头左右子树的结点入队(遇到NULL则不入队)
  3. 重复第二步,直到队列为空

在这里插入图片描述

void LevelOrder(BTNode* root)
{Queue q;					//创建队列QueueInit(&q);				//初始化队列if (root)					//根节点不为空则入队QueuePush(&q, root);while (!QueueEmpty(&q))		//队列不为空,循环继续{BTNode* front = QueueFront(&q);QueuePop(&q);			//出队printf("%d ", front->data);if (front->left)		//如果左子树不为空则入队QueuePush(&q, front->left);if (front->right)		//右子树不为空入队QueuePush(&q, front->right);}QueueDestory(&q);//销毁队列
}

如果你有看我的C++专栏的话,这里用队列超快超方便

 对于层序遍历,我们可以来一个例子立马实践:判断二叉树是否是完全二叉树

 思路很明显,我们假设是完全二叉树,也就是说即使出现了空节点,那我们也把空节点放入队列,在遍历的时候验空,如果空改变指针,此时后面就不能再出现非空节点了,否则立刻返回false

// 判断是否为完全二叉树
// 采用C++语法
bool isCompleteTree(TreeNode* root) 
{// 空树直接返回trueif (root == nullptr) {return true;}queue<TreeNode*> q;q.push(root);bool foundNull = false; // 判断while (!q.empty()) {TreeNode* front = q.front();q.pop();if (front == nullptr){foundNull = true;} else {if (foundNull) {return false;}q.push(front->left);q.pushk(front->right);}}return true;
}

当出现一个空的时候,便不能再出现空,且空不会再带入左右节点,也不能带入


总结

  下篇我们来介绍一下二叉树的一些基本操作~

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

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

相关文章

人工智能创造出大量新型蛋白质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【线性回归分析】:基于实验数据的模型构建与可视化

目录 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 在数据分析领域&#xff0c;线性…

《拿下奇怪的前端报错》:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点

问题背景 在一个使用MongoDB GridFS实现文件存储和分片读取的项目中&#xff0c;同事遇到了一个令人困惑的问题&#xff1a;音频文件总是丢失最后几秒&#xff0c;视频文件也出现类似情况。更奇怪的是&#xff0c;播放器显示的总时长为无限大。这个问题困扰了团队成员几天&…

wps安装教程

WPS office完整版是一款由金山推出的免费办公软件&#xff0c;软件小巧安装快&#xff0c;占用内存极小&#xff0c;启动速度快。WPS office完整版包含WPS文字、WPS表格、WPS演示三大功能模块&#xff0c;让我们轻松办公。WPS的功能是依据OFFICE用户的使用习惯而设计&#xff0…

Java5.--继承-重写-多态

笔记暂未整理&#xff1a; 一、面向对象的第二大特征&#xff1a;继承 1.分类&#xff1a;业务封装 功能封装 2.作用 封装-->属性的安全&#xff01; 继承-->重用----重用代码&#xff08;属性方法&#xff09; 多态-->扩展 3.实现继承的步骤 ①从多个相似的类中…

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明&#xff1a; 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复&#xff08;附视频&#xff09; 》 Velero 和 OADP 包含的功能和模…

精品!“缠论分笔预测”,缠论分笔波段空间预测指标!

精品&#xff01;“缠论分笔预测”&#xff0c;缠论分笔波段空间预测指标&#xff01; 使用技巧该指标属于缠论相关指标&#xff0c;可结合缠论使用。使用缠论分笔方法来确定波段的高低点&#xff0c;相比使用“ZIG”算法&#xff0c;似乎更为准确。它能有效减少某些股票高点和…

大模型生图安全疫苗注入赛题解析(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月实践赛的大模型生图安全疫苗注入赛道&#xff1b;本文主要整理本次赛事的基本流程和优化方法。&#x1f495;&#x1f495;&#x1f60a; 一…

Unity 山水树木

本章节内容 1. Unity对3D游戏物体的简单操作&#xff1b; 2. 构建山水树木的场景 1. Unity 简易操作 1.1 新建3D游戏场景 1. 打开Unity Hub&#xff0c;点击 New Project &#xff08;新建项目&#xff09;按键&#xff0c;选择第二项 3D(Built-In Render Pipeline)&#xf…

harmonyOS next之实现时间打卡定时器

需求&#xff1a;实现一个时间打卡签到按钮。 实现方法&#xff1a;每隔一秒钟获取一下当前时间。 实现代码如下&#xff1a; Column(){Text(this.curTime).fontColor(#FFFFFF).fontWeight(600).fontSize(32vp)Text(上班打卡).fontColor(#FFFFFF) } .width(170vp) .height(170…

【 香格里拉酒店-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

[0633].第3-3节:@SentinueResource注解

我的后端学习大纲 SpringCloud学习大纲 是什么&#xff1a; SentinueResource是一个流量防卫防护组件注解 用于指定防护资源&#xff0c;&#xff0c;对配置的资源进行流量控制、熔断降级等功能 SentinueResource注解说明&#xff1a; Target({ElementType.METHOD, ElementTy…

选择合适的SSL证书

随着我们在线业务的增长&#xff0c;确保网站安全变得越来越重要。对于许多人来说&#xff0c;保护网站安全的想法似乎令人望而生畏&#xff0c;尤其是在有各种SSL证书可用的情况下。您可能想知道哪一个最适合您的业务需求或如何浏览这些选项。 除了SSL证书之外&#xff0c;使…

SQL Injection | SQL 注入 —— 时间盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;时间盲注 —— 理论篇 时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会返回错误信息&#xff0c;只会回…

appium启动hbuild打包的apk异常解决

目录 一、错误信息 二、问题解决 2.1 通过以下命令获取安装包名称&#xff1a; 2.2 这个launcher状态下的安装包名称和active&#xff0c;替换原先的安装包名称 一、错误信息 通过adb shell dumpsys activity | findstr "mResume" 命令获取的安装包信息&#xff…

第十四届单片机嵌入式蓝桥杯

一、CubeMx配置 &#xff08;1&#xff09;LED配置 &#xff08;1&#xff09;LED灯里面用到了SN74HC573ADWR锁存器&#xff0c;这个锁存器有一个LE引脚,这个是我们芯片的锁存引脚&#xff08;使能引脚&#xff09;&#xff0c;由PD2这个端口来控制的 &#xff08;2&#xff…

【前端】如何制作自己的网站(7)

以下内容接上文。 结合图片的超链接 将img元素作为内容&#xff0c;放在a元素中。即可为图片添加一个超链接。 例如右边的代码&#xff0c;点击头像就会打开“aboutme.html“。 点击右边的图片试试&#xff5e; 两个非文本元素——图片与超链接。 从现在开始&#xff0…

API项目3:API签名认证

问题引入 我们为开发者提供了接口&#xff0c;却对调用者一无所知 假设我们的服务器只能允许 100 个人同时调用接口。如果有攻击者疯狂地请求这个接口&#xff0c;那是很危险的。一方面这可能会损害安全性&#xff0c;另一方面耗尽服务器性能&#xff0c;影响正常用户的使用。…

Golang | Leetcode Golang题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; func constructRectangle(area int) []int {w : int(math.Sqrt(float64(area)))for area%w > 0 {w--}return []int{area / w, w} }

DeBiFormer:带有可变形代理双层路由注意力的视觉Transformer

https://arxiv.org/pdf/2410.08582v1 摘要 带有各种注意力模块的视觉Transformer在视觉任务上已表现出卓越的性能。虽然使用稀疏自适应注意力&#xff08;如在DAT中&#xff09;在图像分类任务中取得了显著成果&#xff0c;但在对语义分割任务进行微调时&#xff0c;由可变形…