目录
[🍯9.1 树的逻辑结构与性质](#🍯9.1 树的逻辑结构与性质)
[🍯9.2 二叉树的的定义与性质](#🍯9.2 二叉树的的定义与性质)
[🍯9.3 树的存储结构](#🍯9.3 树的存储结构)
🍺知识点9:树的概念与性质
🍯9.1 树的逻辑结构与性质
🍊1.树的逻辑结构
通俗来讲,树的逻辑结构就像是一棵树,有一个树根,从这个树根分叉出很多树枝,而在这些树枝的边缘长了许多茂密的叶子,这一切就是"树"这种逻辑结构的组成。
树的官方定义是这么说的:**树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合;当n=0时,为空树,当n>0时,为非空树。**任意一棵非空树都满足:
- 有且仅有一个被称为根的结点(如下图的结点A就是根结点)。
- 除根结点外的其余结点可分为m(m>0)个互不相交的有限集T1、T2、···、Tm,其中每个集合本身又是一棵树,称为根的子树;如下图B、C、D是根结点A的子树。
01.树最适合用来表示( )的数据。 A. 有序 B. 无序 C. 任意元素之间具有多种联系 D. 元素之间具有分支层次关系
🍊详细题解:
本题考察的其实是树的逻辑结构,树是一种分层结构,适合表示那些具有层次关系的元素结构。具有如下特点:
- 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
- 树中所有结点可以有零个或多个后继。
但需要注意的是,并不能表示任意元素间的多种关系,即不能表示一个结点有多个前驱这种情形,这是"图"的数据结构。
✅正确答案:D
🍊2.树的相关术语
对于上图关于树的逻辑结构,相关术语较多,因此我们在此进行了解:
- **结点的度:**一个结点含有的子树的个数;例如上图A结点的度为3,C结点的度为2,N结点的度为0。
- **树的度:**树中结点的最大度数;例如上图结点D的度为4,因此上图树的度为4。
- **叶结点:**度为0的结点称为叶结点;例如上图的N、O、P结点。
- **分支结点:**度不为0的结点;例如上图的A、B、C、D、E、J结点。
- **父亲结点:**若一个结点含有子结点,则这个结点称为其子结点的父结点;如A是B、C、D的父亲结点。
- **兄弟结点:**具有相同父结点的结点互称为兄弟结点;如上图的B、C、D结点互为兄弟结点。
- **堂兄弟结点:**父亲结点互为兄弟结点的结点;如上图G与H结点互为堂兄弟结点,因为它们的父结点分别为B和C,B和C互为兄弟结点。
- **结点的层次:**从根开始定义,根为第1层,根的子结点为第2层,以此类推;例如上图A结点为第1层,B结点为第2层,F结点为第3层,O结点为第4层。
- **树的深度/高度:**树中结点的最大层次;例如上图树的高度为4。
- **路径:**树中两个结点之间所经过的结点序列;例如上图中N到A的路径为N-E-B-A。
**路径长度:**两个结点之间路径上经过的边数;例如上图N到A的路径长度为3,因此下面这道题应当选A。
03.树的路径长度是从树根到每个结点的路径长度的( )。
A. 总和
B. 最小值
C. 最大值
D. 平均值**结点的祖先:**从根到该结点所经分支上的所有结点;如N的祖先有E、B、A。
**子孙:**结点的子树中的所有结点;例如上图中所有结点(除A自身以外)都是A的子孙,E的子孙是N、O。
**森林:**由m棵不相交的树组成的集合。
🍊3.树的性质
关于树的性质,我们首先需要区分两个概念,那就是度为m的树 与m叉树的区别:
|------------------|-----------------|
| 度为m的树 | m叉树 |
| 任意结点的度 ≤ m | 任意结点的度 ≤ m |
| 至少有一个结点度 = m | 允许所有结点的度都 <= m |
| 一定是非空树,至少有m+1个结点 | 可以是空树 |在区分了度为m的树与m叉树的区别后,我们就可以进一步来介绍树的一些常见性质了。
性质1:结点数 = 总度数 + 1
**证明:**这是因为树中的所有结点的度数之和等于除了根结点的所有结点数之和,即+1加的是根结点。因此下面这道题应当选A。
02.一棵有n个结点的树的所有结点的度数之和为( )。 A. n-1 B. n C. n+ 1 D. 2n
cpp07.【2010统考真题】在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结 点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是( ) A. 41 B. 82 C. 113 D. 122
这道题也是应用上面的性质1求解,通过总度数与总结点数之间的关系构建方程,进而求解出度为0的结点个数(即叶结点的个数),其解法如下:
性质2:度为m的树中第i层上至多有个结点()。
**证明:**由于这里考察的是至多情况,因此度为m的树每一层都应该尽量排满,即第一层排1个结点,第2层排m个结点,第3层排m*m个结点,第四层排m*m*m个结点,以此类推。
性质3:高度为h的m叉树至多有个结点。
**证明:**这里是在性质2的基础上推导出来的,因为考虑m叉树总共至多的结点个数,因此每一层都应该排满,即最后是在求一个等比数列求和。
性质4:高度为h的m叉树至少有h个结点;高度为h,度为m的树至少有h+m-1个结点。
cpp05.度为4、高度为h的树,( )。 A. 至少有h+3个结点 B. 至多有4h-1个结点 C. 至多有4h个结点 D. 至少有h+4个结点
由性质4我们知道,对于一个高度为h,度为4的树,其至少有h+4-1 个结点,即h+3个结点,因此选A。
04.对于一棵具有n个结点、度为4的树来说,( )。 A. 树的高度至多是n-3 B. 树的高度至多是n-4 C. 第i层上至多有4(i-1)个结点 D. 至少在某一层上正好有4个结点
对于A、B选项:这道题其实是性质4的变形考法,由于度为4的树要求该树一定包含至少一个度为4的点,因此,想要让这个树的高度越高,就必须让该树只存在一个度为4的点,通过下图的计算,应当选A。
性质5: 具有n个结点的m叉树的最小高度为。
**证明:**由于我们这里求的是具有n个结点的最小高度,因此该m叉树的每一层也应当排满,假设具有n个结点的m叉树的最小高度为h,那么n一定小于等于h层全排满的情况,n也一定大于h-1层全排满的情况,这时我们就得到了一个等式,进行求解。
1
1
1
1
cpp06.假定一棵度为3的树中,结点数为50,则其最小高度为( )。 17.假定一棵三叉树的结点数为50,则它的最小高度为( ). A. 3 B. 4 C. 5 D. 6
**解:**上面两问的本质相同,要想让树的高度最小,就尽量将每一层都排满。
📜习题检测
cpp01.含有n个结点的三叉树的最小高度是多少?
由于此处求的是最小高度,因此三叉树的每一层都需要排满,这里其实可以直接套用上面的性质5直接得出结果,这里的m=3,由上面结论得其最小高度应当为:,但是在这里还是再证明一下下吧!
cpp02.已知一棵度为4的树中,度为0,1,2,3的结点数分别为14,4,3,2,求该树的结点总数n 和度为4的结点个数,并给出推导过程。
cpp03.已知一棵度为m的树中,有n1个度为1的结点,有n2个度为2的结点......有nm个度为 m的结点,问该树有多少个叶子结点?
这道题其实和上一道题本质相同,都是应用【性质1:总度数+1=总结点数】来构造方程,其相关解法过程如下:
到这里,我们已经初步掌握了有关于树的逻辑结构与性质,接下来我们会再进一步专注于研究m=2时的二叉树的定义和相关性质
🍯9.2 二叉树的的定义与性质
🍊1.二叉树的定义
二叉树是n个结点的有限集合,每个结点至多只有两棵子树,即二叉树中不存在度大于2的结点,其特点有:
- n≥0时,每个结点最多有两棵子树,且左右不能颠倒,分别为左子树和右子树。
值得注意的是二叉树是有序树,左右子树如果颠倒就会变成一棵完全不同的二叉树,因此即使树中结点只有一棵子树,也要区分它是左子树还是右子树。下图罗列了二叉树的5种基本形态,所有的二叉树都是由下面这五种基本形态组合而成的。
🍊2.特殊的二叉树
**(1) 满二叉树:**一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
**(2)完全二叉树:**高度为h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。
Q1:什么样的二叉树不算是完全二叉树呢?
**A1:**例如下图,左侧的这棵二叉树前3层同满二叉树一样,但最后一层没有排满,但元素的编号同满二叉树的元素顺序相同;而右侧的这棵二叉树虽然前3层同满二叉树一样,但是第三层中的元素并没有按满二叉树的顺序排列,13结点之前空出了一个12结点的位置。
cpp22.【2018统考真题】设一棵非空完全二叉树T的所有叶结点均位于同一层,且每个非叶结 点都有2个子结点,若T有k个叶结点,则T的结点总数是( )。 A. 2k-1 B. 2k C. k^2 D. 2^k-1
**(3)二叉排序树:**左子树上所有结点的关键字均小于根结点的关键字,右子树上所有结点的关键字均大于根结点的关键字,同时左右子树各是一棵二叉排序树。
**(4)平衡二叉树:**树上任一结点的左子树和右子树的深度之差不超过1,这会使得它具有更高的搜索效率;比如在下图中我们要找到70这个结点,我们使用平衡二叉树只需要走两步即可找到,而在非平衡二叉树中需要走6步。
🍊3.二叉树的性质
性质1:非空二叉树上的叶子结点数等于度为2的结点数加1,。
**证明:**这个性质的证明我们需要结合之前提到的树的【性质1:结点数=总度数+1】,具体证明过程如下图所示:
03.具有10个叶子结点的二叉树中有( )个度为2的结点。 A. 8 B. 9 C. 10 D. 11
解:由上述的性质1可得,叶子结点个数减1就是度为2的结点个数,因此选B。
06.设二叉树有2n个结点,且m<n,则不可能存在()的结点。 A. n个度为0 B. 2m个度为0 C. 2m个度为1 D. 2m个度为2
cpp21.【2011统考真题】若一棵完全二叉树有768个结点,则该二叉树中叶结点的个数是( ). A. 257 B. 258 C. 384 D. 385
**解:**性质1十分实用,有时可以大大缩短解题步骤与时间,比如该题我们在法二中运用了性质1,可以快速求解。
性质2:非空二叉树上第k层上至多有个结点
**证明:**这个性质比较好理解,非空二叉树想要在第K层上有最多的结点,就需要前K-1层每一层都排满,这样才可以达到在第k层存在最多的结点。
11.若一棵深度为6的完全二叉树的第6层有3个叶子结点,则该二叉树共有( )个叶子 结点。 A. 17 B. 18 C. 19 D. 20
**解:**由于该二叉树是完全二叉树,因此说明前5层都排满了,第五层有个结点,由于第六层只有3个叶子结点,说明第5层有2个度不为0的结点,14个叶子结点,该二叉树总计14+3个叶子结点,因此选A。
性质3:高度为h的非空二叉树至多有个结点。
**证明:**这个性质其实也可以用树的总体性质推导得出,由于高度为h的m叉树最多有个结点,将m=2代入,就可以得到该结论了。
04.设高度为h的二叉树上只有度为О和度为2的结点,则此类二叉树中所包含的结点数至少为( )。 A. h B. 2h-1 C. 2h+1 D. h+1
**解:**这题其实并不应用该性质,但这是这道题的反向出法,求二叉树的最少结点个数,由于这题中强调了只存在度为0和度为2的结点,因此我们可以初步确定该二叉树的结构如下图所示,接下来我们就可以通过找规律确定公式,因此本题选B。
08.设二叉树只有度为0和2的结点,其结点个数为15,则该二叉树的最大深度为( )。 A. 4 B. 5 C. 8 D. 9
**解:**这题其实就是上面这题的变式,可以通过画图的方式解决这道题,然后归纳出一个公式,最后通过求解可得本题答案为C。
09.高度为h的完全二叉树最少有( )个结点。 A. 2^h B. 2^h+1 C. 2^(h-1) D. 2^h-1
**解:**由于本题求的是完全二叉树的最少结点,因此当它的最后一层只排1个结点时,它就有了最少的结点数,因此我们可以用上述性质计算出前h-1层的二叉树的结点个数,然后加上最后一层的一个结点,因此选C。
10.已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则完全二叉树的结点个 数最少是( )。 A. 39 B. 52 c. 111 D. 119
**解:**由于求完全二叉树结点的最少个数,因此说明第6层的叶结点位于二叉树的最后一层,前5层同满二叉树完全相同,因此前5层总共有个结点,加上第6层的8个叶结点,最终应当是31+8=39个结点。
cpp20.【2009统考真题】已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则该 完全二叉树的结点个数最多是( ). A. 39 B. 52 C. 111 D. 119
**解:**这一题明显和上面一题恰好相反,求的是该完全二叉树的最多结点个数,因此第6层的叶结点就应当考虑为二叉树倒数第二层遗留下来的,这时我们求出第6层有个结点,其中有32-8个结点都应当是度为2的结点,这就导致第7层有24*2个结点。最终计算二叉树的总结点个数:个结点,因此选C。
性质4.1:具有n个(n>0)结点的完全二叉树的高度为
**证明:**这个结论我们同样可以通过树的总体性质公式推导,我们知道对于具有n个结点的m叉树的最小高度为,将m=2代入即可得出上面的结论。
05.假设一棵二叉树的结点个数为50,则它的最小高度是( )。 A. 4 B. 5 C. 6 D. 7
**解:**对于这道题求二叉树的最小高度,那就说明二叉树每一层都应当尽量排满,即可以使用求满二叉树高度的公式,此时n=50,,然后向上取整,最后得到h=6,因此选C。
12.一棵完全二叉树上有1001个结点,其中叶结点的个数是( )。 A. 250 B. 500 C. 254 D. 501
**解:**对于本题我们首先应当计算出树的高度,然后计算出最后一层的结点个数与倒数第二层的结点个数,最后将这两层的叶子结点个数相加就可以得出答案,因此选D。
性质4.2:具有n个(n>0)结点的完全二叉树的高度为
**证明:**为什么称这个性质为4.2呢,是因为这是性质4.1的变式,我们在推导过程中修改了等式比较中的上下限。假设n个结点的二叉树高度为h,那么该二叉树的结点个数一定大于等于h-1层前的所有结点数之和+1,也一定小于排满h层的结点数之和+1,于是我们可以这么证明:
16,在一棵完全二叉树中,其根的序号为1,( )可判定序号为p和q的两个结点是否在同一层。 A. log2(q)↓=log2(p)↓ B. log2(q)=log2(p) c. log2(p)↓+ 1 = log2(q)↓ D. log2(q)↓+ 1 = log2(p)↓
**解:**这道题可以直接秒杀,因为可以直接运用上述的性质4.2,这是因为若p、q位于同一层,一定会有,两边同时消去1就得到了答案,因此选A。
07.一个具有1025个结点的二叉树的高h为( )。 A. 11 B. 10 c. 11~1025 D. 10~1024
📜习题检测
01.下列关于二叉树的说法中,正确的是()。 A. 度为2的有序树就是二叉树 B. 含有n个结点的二叉树的高度为log2(n) + 1 c. 在完全二叉树中,若一个结点没有左孩子,则它必是叶结点 D. 在任意一棵非空二叉排序树中,删除某结点后又将其插入,则所得二叉排序树与删除 前原二叉排序树相同
**解:**本题选项涉及的知识点较为广泛,因此进行逐一分析如下:
- A选项:在二叉树中,若某个结点只有一个孩子,则这个孩子的左右次序是确定的,但在度为2的有序树中,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序;
- B选项:该公式适用于完全二叉树高度的计算,并不适用于所有的二叉树;
- C选项:根据完全二叉树的定义,在完全二叉树中,若有度为1的结点,则该结点只可能有左孩子而无右孩子,因此C选项正确;
- D选项:在二叉排序树中插入结点时插在叶结点的位置,此时若删除的结点为分支结点,会导致二叉排序树重构,其结构将会发生改变。
02.以下说法中,正确的是(). A. 在完全二叉树中,叶子结点的双亲的左兄弟(若存在)一定不是叶子结点 B. 任何一棵二叉树,叶子结点个数为度为2的结点数减1,即n0=n2-1 C. 完全二叉树不适合顺序存储结构,只有满二叉树适合顺序存储结构 D. 结点按完全二叉树层序编号的二叉树中,第i个结点的左孩子的编号为2i
122
cpp18.已知一棵有2011个结点的树,其叶结点个数是116,该树对应的二叉树中无右孩子的结 点个数是( )。 A. 115 B. 116 C. 1895 D. 1896
**解:**本题的本质考察的是将树转换为二叉树,需要掌握树转换为二叉树的规则------【左孩子右兄弟法】,即左子树为当前结点的孩子结点,右子树为当前结点的兄弟结点,具体分析见下图,答案选D。
13.若一棵二叉树有126个结点,在第7层(根结点在第1层)至多有( )个结点。 A. 32 B. 64 C. 63 D. 不存在第7层
**解:**要使得第7层的结点数最多,该二叉树只考虑高度为7的情况,通过计算我们得道7层满二叉树共127个结点,126只比127少1个结点,说明第7层少了一个结点,第7层排满时有个结点,因此第7层最终至多只有63个结点,因此选C。
14.一棵有124个叶子结点的完全二叉树,最多有( )个结点。 A. 247 B. 248 C. 249 D. 250
**解:**本题提前告知了完全二叉树的叶子结点的个数,因为要求最多的结点个数,因此我们考虑叶子结点产生于最后一层,只有个别叶子结点产生于倒数第二层,通过下图计算,因此选B。
当然这道题其实有更加简便的方法,只需要应用二叉树的性质1就可以求解。
cpp19.对于一棵满二叉树,共有n个结点和m个叶子结点,高度为h、则( ). A. n=h+m B. n+m=2h C. m=h-1 D. n=2^h-1
cpp01.在一棵完全二叉树中,含有n0个叶子结点,当度为1的结点数为1时,该树的高度是多少? 当度为1的结点数为0时,该树的高度是多少?
cpp02.一棵有n个结点的满二叉树有多少个分支结点和多少个叶子结点?该满二叉树的高度是多少?
**解:**关于这道题目,我们可以直接运用性质1求解,因为我们知道满二叉树是不存在度为1的结点的,因此结点总数,因此可以直接求得,;当然我们也可以采取另一种方法,因为是满二叉树,因此可以精确计算出它的高度,然后我们可以直接用公式求最后一层的叶结点个数,而后运用性质1得到分支结点个数。
cpp03.已知完全二叉树的第9层有240个结点,则整个完全二叉树有多少个结点?有多少个叶子结点?
✨✨✨我是分割线✨✨✨
🍯9.3 树的存储结构
🍊1.顺序存储
顺序存储采用一组地址连续的存储单元,自上而下、从左到右存储完全二叉树上的节点元素,将完全二叉树上编号为 i 的结点元素存储在一维数组下标为 i-1 的分量中。
**优点:**这种顺序存储的方式比较适合满二叉树与完全二叉树的存储,因为树中结点的父子关系可与数组的下标相对应,可以节省存储空间(相比链式存储,需要存储除数据元素外的指针),同时又能利用数组元素的下标确定结点在二叉树中的位置。
**缺点:**不适用于非完全二叉树的存储,会产生空间的浪费;如上图右侧二叉树的顺序存储,数组中有很多空间都被浪费了。
**重点:**关于顺序存储,我们通常会考察结点序号与父子之间的逻辑关系,关于这一类的题型以及应用,我们将会通过学习"堆"这种数据结构来深入掌握!
23.【2020统考真题】对于任意一棵高度为5且有10个结点的二叉树,若采用顺序存储结构 保存,每个结点占1个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元 数量至少是( )。 A. 31 B. 16 C. 15 D. 10
解: 对于一棵高度为 h 的二叉树,为了满足任意性,至少需要开个存储单元,此处h=5,因此至少需要开31个存储单元。通过这道题也再次证实了,二叉树的顺序存储结构只适合存储完全二叉树,对于本题的树来说,太浪费存储空间了!
🍊2.链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中 每个结点由三个域组成,数据域和左右指针域 ,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。其中,链式结构又分为二叉链和三叉链,其结构一般如下图所示。
对此,我们简要定义一下二叉链表与三叉链表的结点:
cpp//二叉链表的定义 struct BinaryTreeNode{ struct BinaryTreeNode* leftChild; //指向当前结点的左孩子 struct BinaryTreeNode* rightChild; //指向当前结点的右孩子 DataType data; //存放当前结点的数据 }; //三叉链表的定义 struct BinaryTreeNode { struct BinaryTreeNode* leftChild; //指向当前结点的左孩子 struct BinaryTreeNode* rightChild; //指向当前结点的右孩子 struct BinaryTreeNode* parent; //指向当前结点的父亲结点 DataType data; //存放当前结点的数据 };
15.一棵有n个结点的二叉树采用二叉链存储结点,其中空指针数为( )。 A. n B. n+l C. n-l D. 2n
**解:**二叉链表中的一个指针代表一个分支,n个结点中,除去根结点以外共有n-1个结点,应当有n-1个分支,然而每个结点都有2个指针域,n个结点共有2n个指针域,因此空指针的数量=2n-(n-1)=n+1,即n个结点的二叉链表具有n+1个空链域。