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

news2024/11/26 13:50:14

文章目录

二叉树

考纲内容

复习提示

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个】

知识回顾

 

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

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

相关文章

Hive数据模型

Hive数据模型 1. 表&#xff08;Table&#xff09;&#xff1a; 表是数据库中的基本组成单位&#xff0c;用于存储数据。它由一系列的行和列组成&#xff0c;每行代表一个记录&#xff0c;每列代表一种属性或字段。创建表时&#xff0c;你需要定义列的数据类型、约束和索引等信…

开发中的一些专业术语,POJO、PO...

在 Java 开发中&#xff0c;以下是常见的设计模式和概念&#xff1a; PO&#xff08;Persistent Object&#xff09;&#xff1a;持久化对象&#xff0c;也称为实体类或数据对象。它是与数据库表结构对应的类&#xff0c;通常用于表示持久化数据的实体。PO 类的属性与数据库表的…

Windows端之Python3.9及以上高版本工程打包得到的exe逆向工程解包得到pyc文件进而得到py文件的流程实现

参考来自 【python逆向 pyc反编译】python逆向全版本通杀_python反编译pyc-CSDN博客https://blog.csdn.net/zjjcxy_long/article/details/127346296Pyinstaller打包的exe之一键反编译py脚本与防反编译_pyinstaller防止反编译-CSDN博客https://blog.csdn.net/as604049322/artic…

Java零拷贝技术实战

文章目录 引入传统IO内存映射mmap文件描述符sendFile测试总结 引入 为什么要使用零拷贝技术&#xff1f; 传统写入数据需要4次拷贝&#xff0c;如下图&#xff1a; 传统IO import java.io.*; import java.net.Socket;public class TranditionIOClient {private static fina…

​「Python绘图」绘制太极图

python 绘制太极 一、预期结果 二、核心代码 import turtlepen turtle.Turtle()print("开始绘制太极")radius 100 pen.color("black", "black") pen.begin_fill() pen.circle(radius/2, 180) pen.circle(radius, 180) pen.left(180) pen.circ…

小项目“谈笑风生”测试报告

文章目录 一、项目介绍1.1项目背景1.2功能介绍 二、测试环境三、测试执行过程3.1功能测试3.1.1登录页面测试3.1.2注册页面测试3.1.3主页面测试 3.2界面自动化测试3.2.1登录模块测试3.2.2注册模块测试3.2.3展示各种信息模块测试3.2.34聊天消息传送模块测试 四、测试结论与建议 一…

8.Redis

Redis是一个基于内存的key-value结构数据库&#xff0c;而mysql是通过数据文件&#xff0c;以二维表的方式存储在磁盘上。 优点 基于内存存储&#xff0c;读写性能高适合存储热点数据企业应用广泛 Redis目录文件 启动命令 redis-server.exe redis.windows.conf 退出命令 c…

☺☺☺☺☺☺☺栈的应用习题:有效的括号☺☺☺☺☺☺☺

目录 一解题思路&#xff1a; 二对解答代码分析&#xff1a; 三解答代码展示&#xff1a; 即浅学栈的创建后&#xff0c;可以简单利用其性质&#xff08;先进后出&#xff0c;后进先出&#xff09;来完成对一些题目的解答 如&#xff1a; 一解题思路&#xff1a; 这里我们可…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

2024年开抖音小店需要多少钱?你真的知道吗?最新入驻条件及费用

大家好&#xff0c;我是电商花花。 现在仍然有很多想开抖店&#xff0c;想做抖音小店&#xff0c;但是很多人都不知道投资一家抖音小店需要多少钱&#xff0c;今天花花就给大家讲一下做一家抖音小店需要投入多少资金&#xff0c;以及具体投入到哪些方面。 我们就说一下个体店…

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…

Shuffle Cards (STL rope平衡树库)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 5 1 2 3 输出 2 3 4 1 5 样例2&#xff1a; 输入 5 2 2 3 2 3 输出 3 4 1 2 5 样例3&#xff1a; 输入 5 3 2 3 1 4 2 4输出 3 4 1 5 2 思路&#xff1a; 这道题&…

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…

STM32 VS Code 扩展用户指南

系列文章目录 前言 一、视频教程快速入门 通过我们简单易学的视频教程&#xff0c;快速掌握新版本的使用方法&#xff1a; 二、功能描述 2.1 创建/导入项目 STM32 VS Code 扩展提供两种不同的项目创建选项&#xff1a; STM32CubeMX 项目&#xff1a; 这是一个依靠 CMake 作为…

线下预约线下消费万能DIY小程序源码系统 带完整安装代码包

在数字化时代&#xff0c;线上线下融合的消费模式已成为新趋势。为满足广大商家对于个性化预约系统的需求&#xff0c;我们隆重推出了“线下预约线下消费万能DIY小程序源码系统”。该系统不仅具备完整的安装代码包&#xff0c;还提供了丰富的定制功能&#xff0c;助力商家轻松搭…

【大比武01】AIGC赋能档案文创设计的尝试

关注我们 - 数字罗塞塔计划 - 随着科技的飞速发展&#xff0c;AI技术逐渐深入我们的工作与生活&#xff0c;特别是随着2022年底ChatGPT的横空出世&#xff0c;AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;内容生成式人工智能&#xff09;开始登上历…

Covalent引入五个新网络运营商,提升去中心化特性和数据安全性

为了进一步扩大运营商基础以并践行去中心化网络基础设施的宗旨&#xff0c;Covalent Network&#xff08;CQT&#xff09;在网络中引入了五个新的区块样本生产者&#xff08;BSPs&#xff09;角色。该举措不仅重申了 Covalent Network&#xff08;CQT&#xff09;对社区驱动协议…

20基础解决-buuctf-1.RSA1

2.buuctf-1.RSA1 RSATool2v17工具的使用 打开RSA Tool 1.Number Base 设置为十进制 2.注意&#xff1a;Public Exponent这里要使用16进制的数&#xff0c;如果公钥e17的话&#xff0c;就应该填入十六进制的11 3.给出p,q,e的话直接填入&#xff0c;再点击Calc.D,获得d 4.给出…

【第6节课笔记】LagentAgentLego

Lagent 最中间部分的是LLM&#xff0c;即为大语言模型模块&#xff0c;他可以思考planning和调用什么action&#xff0c;再将其转发给动作执行器action executer执行。 支持的工具如下&#xff1a; Arxiv 搜索 Bing 地图 Google 学术搜索 Google 搜索 交互式 IPython 解释器 IP…

C++ | Leetcode C++题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 l…