初步认识二叉树

server/2024/9/25 21:20:30/

二叉树的概念及结构

二叉树在我们的想象中长这样

下图是满二叉树

二叉树有左右子树

1是根结点,

1的左子树是2,右子树是3;

2是根结点,

2的左子树是4,右子树是5;

3是根结点,

3的左子树是6,右子树是7;

这个满二叉树有3层,则深度/高度为3;

4 和 5为兄弟节点,它们有相同的父节点 2;

4 5 6 7这4个节点都是叶节点,它们没有子节点;

3 的子节点是 6 和 7;

第一层有1个节点,是其他节点的祖先。

第二层有2个节点,

第三层有4个节点,

我们不难发现其规律,那就是在满二叉树中,每一层的节点数成等比数列。

我们可以用等比数列求和公式求出满二叉树的总的结点个数,

还有一种特别的二叉树,叫做完全二叉树

如上图,完全二叉树的特点是,前2层(前n-1层)的结点都是满的,没有空缺;

但是第3层(第n层)的结点有空缺,

第三层的结点从左到右排列,中间不能有空缺的结点,

唯一的空缺只能出现在右边,

下图所示的就 不是 完全二叉树

二叉树的3种遍历方式

我们以这棵树为例,讲解所有遍历的方式

1.前序遍历

前序遍历的顺序是 根 ,左子树, 右子树

最终的遍历结果是 1 2 4 5 3 6 7

观察最下面一行,画出的框框分隔开结点,

可以看出,

1是根结点,2是左子树,3是右子树;

2是根结点,4是左子树,5是右子树;

3是根节点,6是左子树,7是右子树;

4是根节点,N是左子树,N是右子树

(N代表NULL,表示空节点,同理可分析5,6,7作为根结点时的情况)

2.中序遍历

中序遍历的顺序是左子树, 根,右子树

最终遍历的结果是 4 2 5 1 6 3 7

观察最后一行,左子树(2)——根(1)——右子树 (3),

左子树(4)——根(2)——右子树(5) ,

左子树(6)——根(3)——右子树(7) ,

左子树(N)——根(4)——右子树(N) ……

3.后序遍历

后序遍历的顺序是左子树,右子树

最终结果是 4 5 2 6 7 3 1

观察最后一行可以发现,根(1)在最后面

左子树——右子树——根(1)

左子树(4)——右子树(5)——根(2)

左子树(6)——右子树(7)——根(3)

左子树(N)——右子树(N)——根(4)

……

二叉树的代码实现

堆的概念

在二叉树中,堆(Heap)是一种特殊的完全二叉树结构,它满足堆属性(Heap Property)。堆属性分为两种:最大堆(Max Heap)和最小堆(Min Heap)。

  1. 最大堆(Max Heap):在最大堆中,每个父节点的值都大于或等于其所有子节点的值。这意味着根节点(树的顶部节点)是树中的最大值。

  2. 最小堆(Min Heap):在最小堆中,每个父节点的值都小于或等于其所有子节点的值。这意味着根节点是树中的最小值。

上图是最小堆,每个父节点的值都小于(或等于)其所有子节点的值,根节点1是树中的最小值。

上图是最大堆,每个父节点的值都大于(或等于)其所有子节点的值,根节点7是树中的最大值。

堆的存储通常使用数组来实现,因为完全二叉树的性质允许我们用一个数组来紧凑地表示它,而不需要使用指针或链表。在数组中,对于给定的索引 i,其父节点的索引是 (i-1)/2(对于从0开始的索引),左子节点的索引是 2*i+1,右子节点的索引是 2*i+2。这种表示方法简化了堆的插入和删除操作。

我们继续用这张图来分析一下

变成数组结构如下

满足:在数组中,对于给定的下标 i,其父节点的下标是 (i-1)/2(对于从0开始的索引),左子节点的索引是 2*i+1,右子节点的索引是 2*i+2

代码实现

typedef int HPDataType;typedef struct Heap {HPDataType* a;//用数组存数据int size;//当前数组存放的数量int capacity;//数组容量}HP;

具体的建堆过程请阅读我的另一篇博客:http://t.csdnimg.cn/FNBfk


http://www.ppmy.cn/server/98533.html

相关文章

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

FPGA常见型号

FPGA&#xff08;现场可编程门阵列&#xff09;开发板种类繁多&#xff0c;涵盖了从入门级教育用途到高性能工业应用的广泛领域。以下是一些常见的 FPGA 开发板型号及其特点&#xff1a; 1. Xilinx&#xff08;赛灵思&#xff09;系列 Xilinx 是 FPGA 领域的领导者之一&#…

BugKu CTF Misc:眼见非实 啊哒 ping Snowfall

前言 BugKu是一个由乌云知识库&#xff08;wooyun.org&#xff09;推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。 BugKu旨在提供一个实践和学习网络安全的平台&#xff0c;供安全爱好者和渗透测试人员进行挑战和练习。它包含了…

Windows下搭建Telegraf+Influxdb+Grafana(详解一)

InfluxDB&#xff08;时序数据库&#xff09;&#xff0c;常用使用场景&#xff1a;监控数据统计。 grafana&#xff0c;用作监控页面的前端展示。 telegraf&#xff0c;数据采集器。 所有的安装包都上传到网盘 链接: https://pan.baidu.com/s/1Lv6UnfueK7URx7emAatoYg 提取…

qt中调色板索引图像文件转换成cv:Mat格式

如果你的 QImage 使用的是 QImage::Format_Indexed8 格式&#xff0c;这意味着图像是一个 8 位的索引图像。每个像素值是一个 8 位的索引&#xff0c;用于查找调色板中的颜色。这种格式通常用于调色板索引的图像&#xff0c;并且需要一个额外的调色板来解码实际的颜色信息。 在…

poetry配置镜像

1.简介 poetry 是一个包管理和打包的工具。 在 Python 中&#xff0c;对于初学者来说&#xff0c;打包系统和依赖管理是非常复杂和难懂的。即使对于经验丰富的开发者&#xff0c;一个项目总是要同时创建多个文件&#xff1a; setup.py ,requirements.txt,setup.cfg , MANIFES…

有关OmniFocus的几个问题

一位学员向我提了几个有关OmniFocus的问题&#xff0c;我进行了解答&#xff0c;给大家分享一下。 问题&#xff08;一&#xff09; 我们要尽快和尽少地花费时间资源去处理任务&#xff0c;那是不是任务排程时就要制定规则。我有个规则&#xff0c;事前三问。这件事有无价值&am…

文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…