数据结构 - 树,再探

devtools/2024/10/24 12:24:24/

书节上回,我们接着聊二叉,N叉,以及的存储。

在这里插入图片描述

01满二叉

如果一个二叉,除最后一层节点外,每一层的节点数都达到最大值,即每个节点都有两个子节点,同时所有叶子节点都在最后一层,则这个二叉为满二叉

因此可以得到满二叉有以下性质:

(1)的最大层数为k(k>=0,即层数从0开始),则第i层的节点总数为2i,的叶子节点总数为2k,的总节点数为2^(k+1) - 1;

(2)如果已知数的总节点数为n,则的最大层数为k=log2(n+1) - 1(k>=0,即层数从0开始);

(3)从的顶层开始从上到下,从左到右,对每个节点按顺序进行编号,根节点为1作为起始;

a.对于节点i,如果其存在父节点,则父节点编号为i/2向下取整;

b.对于节点i,如果其存在左节点则左节点编号为2i,如果其存在右节点则右节点编号为2i+1;

在这里插入图片描述

02完全二叉

如果一棵,叶子节点只能出现在最后两层,并且最后一层的节点都集中在左侧且从左到右是连续的。

由此我们可以得到完全二叉有以下性质:

(1)叶子节点只能出现在倒数第一层和倒数第二层;

(2)倒数第一层的所有叶子节点都集中此层最左侧连续位置;

(3)倒数第二层如果存在叶子节点则层的所有叶子节点都集中在此层最右侧连续位置;

(4)所有节点中如果存在一个节点只有一个子节点,则此节点一定在倒数第二层,并且这个子节点一定是左节点;

(5)满二叉一种特殊的完全二叉

(6)满二叉性质(3)也适用于完全二叉

(7)如果完全二叉不是满二叉,则除最后一层外为满二叉,适用满二叉所有性质;

(8)如果节点总数为n,并且i<=n/2,则第i个节点为非叶子节点;

(9)如果节点总数为n,如果n为偶数则叶子节点数为n/2;如果n为奇数则叶子节点数为(n+1)/2;

(10)如果的层数为k(k>=0),则数的总节点数的访问为[2k,2(k+1) - 1)];

(11)如果已知数的总节点数为n,则的最大层数为k=log2(n+1) (k>=0,即层数从0开始),并且k向下取整;

在这里插入图片描述

03二叉搜索

二叉搜索是一种特殊的二叉,又叫二叉查找、二叉排序,可以说这是一种为了查询而生的二叉

二叉搜索有以下性质:

(1)每个节点值必须唯一,不能有重复值;

(2)每个节点最多有两个子节点;

(3)对于任意一个节点,如果其存在左子则左子上所有节点值小于该节点值,如果其存在右子则右子上所有节点值大于该节点值;

(3)左子和右子本身也各自是二叉搜索

在这里插入图片描述

04平衡二叉

平衡二叉顾名思义就是使二叉平衡在某种状态下,某种状态具体指中任意一个节点左右子高度差绝对值小于等于1,并且其左右子同样也是平衡二叉

平衡二叉是通过控制的深度来优化二叉搜索平均操作时间。

在这里插入图片描述

AVL是平衡二叉的一种特例,严格执行平衡二叉的定义,也是最早发明的自平衡二叉搜索

红黑也是一种自平衡二叉搜索,但其并没有严格执行平衡二叉定义,平衡条件相对比较宽松,允许左右子高度相差绝对值大于1。

这两种我们后面会找机会单独详细讲解。

此外还有哈夫曼、线段、伸展、替罪羊等二叉这里就不一一介绍了,后面我们单独拿出来讲解。

05N叉

B、B+、2-3-4、R、Trie等多叉我们后面找机会单独拿出来详解。

06存储结构

1、顺序存储

顺序存储只用一组连续的地址空间存储整个

当然并不是所有都适合顺序存储的,还记得上面说的满二叉的性质(3)吗?如果把满二叉从上到下、从左到右,则左右子节点编号可以通过父节点编号表示。如果父节点编号为i,则其左子节点编号为2i,其右子节点编号为2i+1。而根节点作为已知起始值1,就意味着其后代节点都可以通过根节点直接或间接表示。

而编号不经让我们想到数组下标,这就意味着我们可以把整个满二叉装进数组里。因为完全二叉也满足满二叉的性质(3),所以完全二叉也可以装进数组。如下图。

在这里插入图片描述

那如果非完全二叉呢?能否放入数组中呢,答案是肯定可以的。我们只需要把非完全二叉想象成满二叉,把缺少的节点虚拟补全,然后对其编号,最后装入数组,入下图:

在这里插入图片描述

但是我们会发现编号4、5、7位都为空值,当然编号7是可以去掉的,即使如此,还是很浪费数组空间的,因此顺序存储是比较适合完全二叉存储的,而其他类型二叉并不是很适合。

2、链式存储

顺序存储有其局限性,因此大多数都是使用链式存储。链式存储的核心思想就是每一个节点设计为两部分,其一为数据域存放元素值,其二为指针域存放指向子节点指针,节点有多少个子节点指针域就有多少个指针。

我们还是以二叉为例,链式存储结构如下:

在这里插入图片描述

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner


http://www.ppmy.cn/devtools/128451.html

相关文章

基于大模型框架langchain中的faiss向量数据库的应用与完整代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下基于大模型框架langchain中的faiss向量数据库的应用与完整代码实现。首先&#xff0c;我们提供了数据样例&#xff0c;并将其输入到向量数据库中。随后&#xff0c;通过相似度查找功能&#xff0c;实现了对数据的快…

LeetCode--第N个泰波那契数--动态规划

一、题目解析 大家应该都知道斐波那契数&#xff0c;这道题就是利用斐波那契模型解决问题的。 二、代码解析 值得注意的是&#xff0c;这道题利用递归解决会超时。

Python Q-learning 算法详解与应用案例

目录 Python Q-learning 算法详解与应用案例引言一、Q-learning 的基本原理1.1 强化学习基础1.2 Q值及其更新1.3 Q-learning 的特性 二、Python 中 Q-learning 的面向对象实现2.1 QTable 类的实现2.2 Environment 类的实现2.3 Agent 类的实现 三、案例分析3.1 简单环境中的 Q-l…

康养实训室有哪些实训项目?

康养实训室作为专门为老年人设计的集健康管理、康复训练、心理咨询、社交活动于一体的综合性场所&#xff0c;近年来在职业院校和养老机构中得到了广泛应用。它不仅提供医疗和健康服务&#xff0c;还通过多种多样的活动来促进老年人的身心健康。本文将详细介绍康养实训室中的各…

推荐一款多显示器管理工具:DisplayMagician

DisplayMagician是一款开源工具&#xff0c;专为Windows用户设计&#xff0c;能够通过一个快捷方式轻松自动配置屏幕和声音。它特别适合游戏玩家和应用程序用户&#xff0c;可以实现屏幕配置、声音设备切换以及启动额外程序等功能&#xff0c;最后在游戏或应用程序关闭时&#…

STM32G474之“运放OPAMP和ADC”以及“ADC和DMA”问题

在使用STM32G474之“运放OPAMP和ADC”&#xff0c;或“ADC和DMA”时&#xff0c;要注意一下几个问题。如果有有标准库&#xff0c;就不会用HAL库了。不是没有吗&#xff1f;凑合用吧。 问题1、将“DAC3通道1”通过内部连接到"运放OPAMP1"&#xff0c;运放输出到引脚…

洛谷官方题单——【算法1-1】模拟与高精度

目录 [NOIP2003 普及组] 乒乓球题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解 [NOIP2015 普及组] 扫雷游戏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题解 [NOIP2016 提高组] 玩具谜题题目…

AI冲击,AI程序员-2024程序员危机与机遇并存

百度总裁李彦宏说的&#xff1a;“以后其实不会存在程序员这种职业了”。 后来 GitHub首席执行官Thomas Dohmke说&#xff1a;"在AI的帮助下&#xff0c;每个人都能成为程序员"。 再到后来&#xff0c;全球首位 AI 程序员Devin的诞生。虽然有炒作的成分&#xff0c;…