树的定义
树是 n n n( n ≥ 0 n≥0 n≥0)个结点的有限集。当 n = 0 n=0 n=0时,称为空树。
任意一棵非空树应具有以下特性:
- 有且仅有一个特定的被称为根的结点(根结点)。
- 当 n > 1 n>1 n>1时,其余结点可分为 m m m( m > 0 m>0 m>0)个互不相交的有限集 T 1 , T 2 , . . . , T m T_1, T_2, ... , T_m T1,T2,...,Tm,其中每个集合本身又是一棵树,称为根的子树。
没有后继的结点称为“叶子结点”(或 叶结点/终端结点),有后继的结点称为“分支结点”(或 非终端结点)。
显然,树的定义是递归的,即树的定义中用到了其自身。树是一种递归的数据结构,其作为一种逻辑结构的同时也是一种分层结构,具有以下两个特点:
- 根结点是唯一没有前驱的结点。除了根结点外,其他所有结点有且只有一个前驱。
- 树中所有结点都可以有零个或多个后继。
由此可推算出,结点数为 n n n的树中有 n − 1 n-1 n−1条边。(边是连接起树中两个结点之间的“线”)
关于树的基本术语(图片来自王道书)
- 祖先结点:对某一个结点来说,从根结点到这个结点的唯一路径上的所有其它结点,都是这个结点的祖先。例如,对 K K K结点来说,从根结点 A A A到 K K K的唯一路径是 A → B → E → K A→B→E→K A→B→E→K,则结点 A , B , E A, B, E A,B,E都是结点 K K K的祖先结点。
(已经想起LCA了…… - 子孙结点:对某一个结点来说,这个结点的所有后继结点,及其后继结点的后继,后继的后继的后继……直到叶结点,都是这个结点的子孙。例如,对 B B B结点来说,它的子孙包括 E , F , K , L E, F, K, L E,F,K,L结点。而对于根结点来说,整棵树除了它本身,所有结点都是其子孙。
- 双亲结点(父结点)&孩子结点:对某一个结点来说,其直接前驱被称为它的双亲,其直接后继则被称为它的孩子。例如,结点 B B B是结点 E E E的双亲结点(父结点),而结点 E E E是结点 B B B的孩子结点。根结点是树中唯一没有双亲的结点。
- 兄弟结点&堂兄弟结点:对两个结点,若其拥有同一个双亲结点,则这两个结点互称兄弟。双亲在同一层的结点则互为堂兄弟。例如,对结点 E E E,结点 F F F与其互为兄弟结点,而结点 G , H , I , J G, H, I, J G,H,I,J与其互为堂兄弟结点。
- 结点的度和树的度:树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度。例如结点 B B B的度为 2 2 2,结点 D D D的度为 3 3 3,这棵树的度为 3 3 3。(叶结点的度为 0 0 0)
- 结点的深度、高度和层次:结点的层次从树根开始定义,根结点为第 1 1 1层,它的孩子为第 2 2 2层,以此类推。结点的深度就是该结点所在的层次。树的高度(或深度)是树中结点的最大层数。结点的高度是以该结点为根的子树的高度。换而言之,对一个结点来说,其深度是从上往下数的第几层,而高度是从下往上数的第几层。例如,结点 B B B的层数与深度为 2 2 2,高度为 3 3 3。图中的这棵树高度为 4 4 4。深度一般默认从 1 1 1开始计算,但是某些题目中也可能从 0 0 0开始,需要特别注意一下。
- 有序树与无序树:若树中结点的各子树从左到右都是有次序的,不能互换,则称该树为有序树,否则为无序树。
- 路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
(注:因为树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。也就是说,一个结点与其兄弟或堂兄弟结点及这些结点的子孙结点之间都不存在路径) - 森林:森林是 m m m( m ≥ 0 m≥0 m≥0)棵互不相交的树的集合,当 m = 0 m=0 m=0时称为空森林。森林的概念与树的概念十分相近,因为只要把树的根结点删去,其子树的集合就构成了一个森林。反之,只要给 m m m棵独立的树加上一个结点,并把这 m m m棵树作为该结点的子树,则森林就成了树。
树的性质相关
常见考点1:结点数=总度数+1
结点的度指的是该结点的孩子数量,而每个结点与其每个孩子都由唯一的边相连,因此树中所有结点的度数之和等于树中的边数之和。树中除了根结点以外的结点都有唯一的双亲结点,因此结点数 n n n等于边数之和再加 1 1 1,也就是树的总结点数等于总度数 + 1 +1 +1,加的这个“ 1 1 1”就是根结点。
常见考点2:度为 m m m的树和 m m m叉树的区别
度为 m m m的树:
- 任意结点的度 ≤ m ≤m ≤m(最多 m m m个孩子)
- 至少有一个结点的度 = m =m =m(有 m m m个孩子)
- 一定是非空树,至少有 m + 1 m+1 m+1个结点( 1 1 1个根结点 + m +m +m个叶结点)
m m m叉树:
- 任意结点的度 ≤ m ≤m ≤m(最多 m m m个孩子)
- 允许所有结点的度都 < m <m <m
- 可以是空树
常见考点3:度为 m m m的树第 i i i层至多有 m i − 1 m^{i-1} mi−1个结点( i ≥ 1 i≥1 i≥1)
这句话等价于“ m m m叉树的第 i i i层至多有 m i − 1 m^{i-1} mi−1个结点( i ≥ 1 i≥1 i≥1)”。
第 1 1 1层:有 m 0 = 1 m^0=1 m0=1个结点,根结点。
第 2 2 2层:有 m 1 = m m^1=m m1=m个结点,当根结点的度为 m m m时。
第 3 3 3层:有 m 2 m^2 m2个结点,当根结点的度为 m m m,并且根结点的每个孩子结点的度都为 m m m时。
……
以此类推,到第 i i i层时,这一层至多有 m i − 1 m^{i-1} mi−1个结点。
(下图来自王道考研408数据结构课程视频 - 树的性质)
常见考点4:高度为 h h h的 m m m叉树至多有 m h − 1 m − 1 \frac{{{m}^{h}}-1}{m-1} m−1mh−1个结点
由“常见考点 3 3 3”可知,当各层结点数达到最大时,高度为 h h h的 m m m叉树第i层有 m i − 1 m^{i-1} mi−1个结点,对其求和,有:
∑ i = 1 h m i − 1 = m 1 ( 1 − m h ) 1 − m = m h − 1 m − 1 , m 1 = 1 \sum\limits_{i=1}^{h}{{{m}^{i-1}}}=\frac{{{m}_{1}}\left( 1-{{m}^{h}} \right)}{1-m}=\frac{{{m}^{h}}-1}{m-1},{{m}_{1}}=1 i=1∑hmi−1=1−mm1(1−mh)=m−1mh−1,m1=1
一个简单的等比数列求和问题。
常见考点5:高度为 h h h的 m m m叉树至少有 h h h个结点
高度为 h h h的 m m m叉树,至少有 h h h个结点,即每一层只有 1 1 1个结点。
而高度为 h h h的度为 m m m的树,至少有 h + m − 1 h+m-1 h+m−1个结点,即除第一层的某一层有 m m m个结点,其余层均只有 1 1 1个结点。
常见考点6:具有 n n n个结点的 m m m叉树的最小高度为 ⌈ log m ( n ( m − 1 ) + 1 ) ⌉ \left\lceil {{\log }_{m}}\left( n\left( m-1 \right)+1 \right) \right\rceil ⌈logm(n(m−1)+1)⌉
要使 m m m叉树的高度最小,则每个结点要有尽可能多的孩子。
因此,设除叶结点的每个结点均有 m m m个孩子。由“常见考点 4 , 4, 4,”可知,高度为 h h h的 m m m叉树至多有 m h − 1 m − 1 \frac{{{m}^{h}}-1}{m-1} m−1mh−1个结点。假设这 n n n个结点有 h h h层,则有:
m h − 1 − 1 m − 1 < n ≤ m h − 1 m − 1 \frac{{{m}^{h-1}}-1}{m-1}<n\le \frac{{{m}^{h}}-1}{m-1} m−1mh−1−1<n≤m−1mh−1
因为 n n n一定要大于 h − 1 h-1 h−1层的最大结点数,同时小于等于 h h h层的最大结点数,这样才能让这 n n n个结点满足有 h h h的条件。
对这个不等式同时乘以 m − 1 m-1 m−1再加 1 1 1,得:
m h − 1 < n ( m − 1 ) + 1 ≤ m h {{m}^{h-1}}<n\left( m-1 \right)+1\le {{m}^{h}} mh−1<n(m−1)+1≤mh
再同时对 m m m取对数,有:
h − 1 < log m [ n ( m − 1 ) + 1 ] ≤ h h-1<{{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]\le h h−1<logm[n(m−1)+1]≤h
所以解得 h h h的取值范围为:
log m [ n ( m − 1 ) + 1 ] ≤ h < log m [ n ( m − 1 ) + 1 ] + 1 {{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]\le h<{{\log }_{m}}\left[ n\left( m-1 \right)+1 \right]+1 logm[n(m−1)+1]≤h<logm[n(m−1)+1]+1
当 h h h的值满足: h min = ⌈ log m ( n ( m − 1 ) + 1 ) ⌉ {{h}_{\min}}=\left\lceil {{\log }_{m}}\left( n\left( m-1 \right)+1 \right) \right\rceil hmin=⌈logm(n(m−1)+1)⌉(向上取整)时上式成立。
总结一下,考点 2 2 2和考点 4 , 5 4, 5 4,5需要重点掌握。其余知识点也应反复学习,结合课后习题强化记忆加深理解,不熟悉的概念多加练习后自然就能记住。
从这一章开始将会步入408数据结构中最难的部分,树和图我以前在打OI的时候就学的不太好,得打起精神来了。
关于二叉树的内容将放在下一篇博客里。
以上。