数据结构复习指导之二叉树的概念

文章目录

二叉树

考纲内容

复习提示

1.二叉树的概念

1.1二叉树的定义及其主要特性

1.1.1二叉树的定义

1.1.2几种特殊的二叉树

1.1.3二叉树的性质

1.2二叉树的存储结构

1.2.1顺序存储结构

1.2.2链式存储结构

知识回顾


二叉树

考纲内容

(一)树的基本概念
(二)二叉树
           二叉树的定义及其主要特征;二叉树的顺序存储结构和链式存储结构;
           二叉树的遍历;线索二叉树的基本概念和构造
(三)树、森林
           树的存储结构;森林与二叉树的转换;树和森林的遍历
(四)树与二叉树的应用
           哈夫曼(Huffman)树和哈夫曼编码;并查集及其应用

复习提示

本章内容多以选择题或综合题的形式考查,但统考也会出涉及树遍历相关的算法题。树和二叉树的性质、遍历操作、转换、存储结构和操作特性等,满二叉树、完全二叉树、线索二叉树、哈夫曼树的定义和性质,都是选择题必然会涉及的内容。

1.二叉树的概念

1.1二叉树的定义及其主要特性

1.1.1二叉树的定义

二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒

与树相似,二叉树也以递归的形式定义。二叉树是n(n=>0)个结点的有限集合:
① 或者为空二叉树,即 n=0。
②或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。

二叉树是有序树,若将其左、右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分它是左子树还是右子树。二叉树的5种基本形态如图所示。

二叉树与度为2的有序树的区别:

①  度为2的树至少有3个结点,而二叉树可以为空

② 度为2的有序树的孩子的左右次序是相对于另一个孩子而言的,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,即二叉树的结点次序不是相对于另一结点而言的,而是确定的

1.1.2几种特殊的二叉树

1) 满二叉树。一棵高度为 h,且有 2^{h}-1个结点的二叉树称为满二叉树,即二叉树中的每层都含有最多的结点,如图5.3(a)所示。满二叉树的叶结点都集中在二叉树的最下一层,并且除叶结点之外的每个结点度数均为2。

可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为\left \lfloor i / 2 \right \rfloor该符号为向下取整符);若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。

命题追踪——完全二叉树中结点数和叶结点数的关系

2) 完全二叉树。高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树,如图 5.3(b)所示。其特
点如下:

① 若 i\leqslant \left \lfloor n /2 \right \rfloor向下取整符),则结点i为分支结点,否则为叶结点。

②叶结点只可能在层次最大的两层上出现。对于最大层次中的叶结点,都依次排列在该层最左边的位置上。

③ 若有度为1的结点,则最多只可能有一个,且该结点只有左孩子而无右孩子。

④ 按层序编号后,一旦出现某结点(编号为i)为叶结点或只有左孩子,则编号大于i的结点均为叶结点。

⑤ 若n为奇数,则每个分支结点都有左孩子和右孩子:若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。


3) 二叉排序树。左子树上所有结点的关键字均小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。


4) 平衡二叉树。树中任意一个结点的左子树和右子树的高度之差的绝对值不超过1。关于二叉排序树和平衡二叉树的详细介绍,见本书中的7.3节。

命题追踪——正则k叉树树高和结点数的关系的应用

5) 正则二叉树。树中每个分支结点都有2个孩子,即树中只有度为0或2的结点。

1.1.3二叉树的性质

1) 非空二叉树上的叶结点数等于度为2的结点数加1,即n0=n2+1。

证明:设度为0,1和2的结点个数分别为n0,n1和n2,结点总数n=n0+n1+n2。再看二叉树中的分支数,除根结点外,其余结点都有一个分支进入,设B为分支总数,
则(n为节点数)n=B+1。由于这些分支是由度为1或2的结点射出的,因此又有 B=n1 + 2n2。于是得n0+n1+n2=n1+2n2+1,则n0=n2+1。

注意:该性质经常在选择题中涉及,希望读者牢记并灵活应用。

2) 非空二叉树的第k层最多有2^{k-1}个结点(k>1)
第1层最多有 1个结点(根),第2层最多有 2个结点,以此类推,可以证明其为一个公比为2的等比数列 2^{k-1}

3) 高度为h的二叉树至多有 2^{h}-1个结点(h>1)
该性质利用性质2求前h项的和,即等比数列求和的结果。

注意:性质2和性质3还可以拓展到 m叉树的情况,即m 叉树的第k层最多有 m^{k-1}个结点,高度为 h的 m 叉树至多有(2^{h}-1) / (m-1)个结点。

4)对完全二叉树按从上到下、从左到右的顺序依次编号1,2,…,n,则有以下关系:

① 若 i\leqslant \left \lfloor n / 2 \right \rfloor,则结点i为分支结点,否则为叶结点,即最后一个分支结点的编号为\left \lfloor n / 2 \right \rfloor

② 叶结点只可能在层次最大的两层上出现(若删除满二叉树中最底层、最右边的连续 2个或以上的叶结点,则倒数第二层将会出现叶结点)。

③ 若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(度为1的分支结点只可能是最后一个分支结点,其结点编号为\left \lfloor n / 2 \right \rfloor)。

④ 按层序编号后,一旦出现某结点(如结点 i)为叶结点或只有左孩子的情况,则编号大于i的结点均为叶结点(与结论①和结论③是相通的)。

⑤ 若n为奇数,则每个分支结点都有左、右孩子;若n为偶数,则编号最大的分支结点(编号为 n/2)只有左孩子,没有右孩子,其余分支结点都有左、右孩子。

⑥ 当i>1时,结点i的双亲结点的编号为\left \lfloor n / 2 \right \rfloor

⑦ 若结点i有左、右孩子,则左孩子编号为 2i,右孩子编号为 2i+1。

⑧ 结点i所在层次(深度)为 \left \lfloor log_{2}i \right \rfloor+1


5) 具有n个(n>0)结点的完全二叉树的高度为\left \lceil log_{2}(n+1) \right \rceil向上取整)或 \left \lfloor log_{2}n \right \rfloor+1向下取整

设高度为 h,根据性质 3和完全二叉树的定义有:

2^{h-1}-1<n\leqslant 2^{h}-1或者2^{h-1}\leqslant n<2^{h}

2^{h-1}<n+1\leqslant 2^{h},即 h-1<log_{2}(n+1)\leqslant h,因为h为正整数,所以,h=\left \lceil log_{2}(n+1) \right \rceil或者得 h-1\leqslant log_{2}n<h,所以h=\left \lfloor log_{2}n \right \rfloor+1

1.2二叉树的存储结构

1.2.1顺序存储结构

二叉树的顺序存储是指用一组连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在一维数组下标为i-1的分量中。

依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系,这样既能最大可能地节省存储空间,又能利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。

命题追踪——特定条件下二叉树树形及占用存储空间的分析

但对于一般的二叉树,为了让数组下标能反映二叉树中结点之间的逻辑关系,只能添加一些并不存在的空结点,让其每个结点与完全二叉树上的结点相对照,再存储到一维数组的相应分量中。

然而,在最坏情况下,一个高度为h且只有h个结点的单支树却需要占据近 2^{h}-1个存储单元。二叉树的顺序存储结构如图5.4所示,其中0表示并不存在的空结点。

注意:建议从数组下标1开始存储树中的结点,保证数组下标和结点编号一致。

1.2.2链式存储结构

由于顺序存储的空间利用率较低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每个结点。在二叉树中,结点结构通常包括若干数据域和若干指针域,二叉链表至少包含3个域:数据域 data、左指针域 lchild 和右指针域 rchild,如图5.5 所示。

图 5.6 所示为一棵二叉树及其对应的二叉链表。而实际上在不同的应用中,还可以增加某些指针域,如增加指向父结点的指针后,变为三叉链表的存储结构。

二叉树的链式存储结构描述如下:

typedef struct BiTNode{
    ElemType data;                    //数据域
    struct BiTNode *lchild,*rchild;   //左、右孩子指针
}BiTNode,*BiTree;

使用不同的存储结构时,实现二叉树操作的算法也会不同,因此要根据实际应用场合(二叉树的形态和需要进行的运算)来选择合适的存储结构。

容易验证,在含有n个结点的二叉链表中,含有n+1个空链域(重要结论,经常出现在选择题中)。在下一节中,我们将利用这些空链域来组成另一种链表结构--线索链表。

【因为每一个节点有左右两个指针,n个节点共有2n个链域,而n个节点只需用n-1个指针就可互连(因为连接n个点只需n-1条直线),所以还剩下2n-(n-1)=n+1个】

知识回顾

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一件事做了十年

目录 一、背景二、过程1.贫困山区的心理悲哀2.基础差的客观转变3.对于教育的思考4.持续做这件事在路上5.同行人有很早就完成的&#xff0c;有逐渐放弃的&#xff0c;你应该怎么办&#xff1f;6.回头看&#xff0c;什么才是最终留下的东西? 三、总结 一、背景 在哪里出生我们无…

Colab/PyTorch - Getting Started with PyTorch

Colab/PyTorch - Getting Started with PyTorch 1. 源由2. 概要2.1 PyTorch是什么&#xff1f;2.2 为什么学习PyTorch&#xff1f;2.3 PyTorch库概览 3. 步骤4. 预期&展望5. 总结6. 参考资料 1. 源由 世界在发展&#xff0c;为其服务的技术也在不断演变。每个人都要跟上技…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

一竞技LOL:中韩首场对决暴露TES大问题 BLG和T1的比赛成为焦点!

北京时间5月12日,昨天结束的MSI比赛中第二场比赛是本次MSI第一场中韩大战,由LCK赛区的一号种子GEN战队对阵LPL的二号种子TES战队。TES最终是2:3非常遗憾的输给了Gen,这也意味着TES将要去败者组,本场比赛也是暴露出了TES战队比较大的问题,中单的英雄池以及上单369的状态成为TES战…

enable_shared_from_this使用笔记

解决了&#xff1a; 不能通过原指针增加引用次数的问题 &#xff0c;通过weak_ptr实现。 class MyCar:public std::enable_shared_from_this<MyCar> { public:~MyCar() { std::cout << "free ~Mycar()" << std::endl; } };int main() { MyCar* _…

走进开源,拥抱开源

走进开源&#xff0c;拥抱开源 一、开源文化1.1 什么是开源1.2 为什么要开源1.3 有哪些开源协议 二、选择开源2.1 开源社区的类型与特点2.2 如何选择开源社区2.3 如何选择开源项目 三、参与开源3.1 开源社区的参与方式3.2 开源项目的参与方式 四、Apache Doris 参与示例4.1 Dor…

【iOS】RunLoop详解(二)

RunLoop详解&#xff08;二&#xff09; RunLoop 的概念RunLoop 与线程的关系RunloopRunloop与线程的关系RunLoop对外的接口Runloop的Mode举例说明小结 RunLoop 的内部逻辑RunLoop的底层实现苹果用RunLoop实现的功能AutoreleasePool事件响应手势识别界面更新定时器PerformSelec…

Python经典案例爬取豆瓣Top250电影数据

随着网络数据的日益丰富&#xff0c;如何从海量的信息中快速、准确地提取出有价值的数据&#xff0c;成为了许多开发者和技术爱好者关注的焦点。在这个过程中&#xff0c;网络爬虫技术凭借其强大的数据获取能力&#xff0c;成为了数据分析和挖掘的重要工具。本文将通过一个经典…

[JNI]使用jni实现简单的Java调用本地C语言代码

[JNI]使用jni实现简单的Java调用本地C语言代码 JNI的解释 Java Native Interface&#xff0c;即Java本地接口。 在Java官方描述中为&#xff1a; The JNI is a native programming interface. It allows Java code that runs inside a Java Virtual Machine (VM) to interope…

day11-StreamFile

1.Stream流 1.1 体验Stream流 需求&#xff1a;按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"杨"开头的元素存储到一个新的集合 把"杨"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到…

C++语言题库(三)—— PAT

目录 1. 打印点、圆、圆柱信息 2. 国际贸易统计 3. 设计一个类CRectangle 4. 定义一个时间类 5. 定义一个Date类 6. 定义一个Time类 7. 设计一个People类 8. 平均成绩 9. 计算若干个学生的总成绩及平均成绩 11. 使用面向对象的方法求长方形的周长 1. 打印点、圆、圆柱…

回溯算法精讲

原理 回溯&#xff0c;就和深度优先遍历&#xff08;DFS&#xff09;类似&#xff0c;属于先一层到底直至到终点&#xff0c;如果这条路径不对&#xff0c;则回退一下&#xff0c;再继续往下搜索。 抽象地说&#xff0c;解决一个回溯问题&#xff0c;实际上就是遍历一棵决策树…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗&#xff1f;Disk Map for Mac来帮您轻松解决&#xff01;通过独特的TreeMap视觉显示技术&#xff0c;让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作&#xff0c;即可快速释放磁盘空间&#xff0c;让您的Mac更“轻”松。快来…

el-checkbox选中后的值为id,组件显示为label中文

直接上代码 方法一 <el-checkbox v-for"item in list" :key"item.id" :label"item.id">{{中文}} </el-checkbox> 方法二 <el-checkbox-group class"flex_check" v-model"rkStatusList" v-for"item…

prometheus、mysqld_exporter、node_export、Grafana安装配置

工具简介 Prometheus&#xff08;普罗米修斯&#xff09;&#xff1a;是一个开源的服务监控系统和时间序列数据库 mysqld_exporter&#xff1a; 用于监控 mysql 服务器的开源工具&#xff0c;它是由 Prometheus 社区维护的一个官方 Exporter。该工具通过连接到mysql 服务器并执…

EasyNmon服务器性能监控工具环境搭建

一、安装jdk环境 1、看我这篇博客 https://blog.csdn.net/weixin_54542209/article/details/138704468 二、下载最新easyNmon包 1、下载地址 https://github.com/mzky/easyNmon/releases wget https://github.com/mzky/easyNmon/releases/download/v1.9/easyNmon_AMD64.tar.…

openssl 生成证书步骤

本地测试RSA非对称加密功能时&#xff0c;需要用到签名证书。本文记录作者使用openssl本地生成证书的步骤&#xff0c;并没有深入研究openssl&#xff0c;难免会有错误&#xff0c;欢迎指出&#xff01;&#xff01;&#xff01; 生成证书标准流程&#xff1a; 1、生成私钥&am…

单位学校FM调频电台直放站系统

随着教育技术的不断发展&#xff0c;校园广播系统的建设已成为现代学校必不可少的一部分。作为传统有线广播的有效补充&#xff0c;基于无线电信号传输的 FM 调频电台在学校的使用日益广泛&#xff0c;尤其是在紧急通知、日常信息传播及教学辅助等方面发挥着重要作用。为了增强…

msvcp140dll怎么修复,分享5种有效的解决方法

MSVCP140.dll文件丢失这一现象究竟是何缘由&#xff0c;又会引发哪些令人头疼的问题呢&#xff1f;在探索这个问题的答案之前&#xff0c;我们先来深入了解这个神秘的DLL文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它扮演着至关重要的…