树
【本节仅描述树的定义、术语以及相关性质】
定义
树是由若干个结点组成的有限集合。具有如下特征:
- 有且仅有一个根结点;
- 除根结点外,每个其它结点有且仅有一个直接的父结点;
- 除根结点外,每个结点可以有零个或者多个子结点;
- 结点之间通过边连接,形成层级关系,且不存在环路。
当有限集合内的元素数大于1时,除根结点外的其余结点可以分为 m(m>0) 个互不相交的有限集,其中每个有限集合本身又是一棵树,并且称为根的子树。
从递归角度来看:
- 一棵树要么是空树(没有任何节点);
- 要么由一个根节点和零个或多个子树组成,而这些子树本身又是树。
术语
根节点 :树的起始节点,没有父节点。
父节点,子节点 :结点之间的直接上下级关系。
叶节点 :没有子节点的结点。叶节点的度为0。
分支节点:有子结点的结点称为分支结点。度大于0。
度:一个结点的子节点个数。
层次、深度、高度 :结点的层次从根开始定义,根结点为第1层,它的子结点为第2层,以此类推。结点的深度就是结点所在的层次。树的高度或深度是树中结点的最大层数。结点的高度是以该节点为根的子树的高度。
子树(subtree) :以某个结点为根结点的树。
路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的。
路径长度:是路径中所经过的边的数目(即节点数减一)。
说法 | 含义 |
---|---|
两结点间的路径长度 | 连接两个结点路径中的边数 |
树的路径长度(内部路径长度) | 树中所有结点到根节点路径长度的总和 |
树的直径(最大路径长度) | 树中两个结点间最长路径的边数 |
树的性质
1.树的结点数n等于所有结点的度数之和加1
令一棵树的总结点数为n,那么总度数为n−1,不同度数的结点的数量为nm,m为度数下标,那么n=n0+n1+n2+...+nm=∑i=0mni再求每个不同度数的结点的总度数为m∗nm,那么n−1=1n1+2n2+3n3+...+mnm=∑i=1mini得到:n=∑i=1mini+1=∑i=0mni
令一棵树的总结点数为n,那么总度数为n-1,不同度数的结点的数量为n_m,m为度数下标,那么\\
n = n_0 + n_1 + n_2 + ... + n_m = \sum_{i=0}^m n_i \\
再求每个不同度数的结点的总度数为m*n_m,那么\\
n - 1 = 1n_1 + 2n_2+ 3n_3 + ... + mn_m = \sum_{i=1}^m in_i \\
得到:n = \sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i
令一棵树的总结点数为n,那么总度数为n−1,不同度数的结点的数量为nm,m为度数下标,那么n=n0+n1+n2+...+nm=i=0∑mni再求每个不同度数的结点的总度数为m∗nm,那么n−1=1n1+2n2+3n3+...+mnm=i=1∑mini得到:n=i=1∑mini+1=i=0∑mni
由上述推导过程,可以看出,当计算树的总度数的时候,叶节点(没有子节点的结点)是没有贡献的,因为按照计算公式,叶结点的总度数为0。但是当计算总结点数的时候是有的。所以,可以借助最后推导出的公式来计算叶结点的结点数,计算如下:
由于已知:∑i=1mini+1=∑i=0mni然后对等号右边部分提取出n0,得到∑i=0mni=n0+∑i=1mni,等效替换回原式得到∑i=1mini+1=n0+∑i=1mni化简n0=∑i=1mini−∑i=1mni+1=∑i=1m(i−1)ni+1
由于已知:\sum_{i=1}^m in_i + 1 = \sum_{i=0}^m n_i \\
然后对等号右边部分提取出n_0,得到\\
\sum_{i=0}^m n_i = n_0 + \sum_{i=1}^m n_i,等效替换回原式得到\\
\sum_{i=1}^m in_i + 1 = n_0 + \sum_{i=1}^m n_i \\
化简\\
n_0 = \sum_{i=1}^m in_i - \sum_{i=1}^m n_i + 1 = \sum_{i=1}^m (i-1)n_i + 1
由于已知:i=1∑mini+1=i=0∑mni然后对等号右边部分提取出n0,得到i=0∑mni=n0+i=1∑mni,等效替换回原式得到i=1∑mini+1=n0+i=1∑mni化简n0=i=1∑mini−i=1∑mni+1=i=1∑m(i−1)ni+1
2.度为 m 的树中第 i 层上至多有m的(i - 1)次方个结点(i ≥ 1)
已知第一层只有一个结点为根结点;那么第2层至多就有 m 个结点,那么第3层至多就有 m² 个结点,归纳推导出
第i层的结点数≤mi−1,其中(i≥1)
第i层的结点数 ≤ m^{i-1} ,其中(i≥1)
第i层的结点数≤mi−1,其中(i≥1)
3.高度为h的m叉树至多有 (m^h - 1)/(m - 1) 个结点
如果要让m叉树的结点数达到最大,那么除第一层外,每层的结点数都应满足 n_h = m^(h-1),计算总结点数为
N=1+m1+m2+m3+...+mh−1=(mh−1)/(m−1)
N = 1 + m^1 + m^2 + m^3 + ... + m^{h-1} = (m^h-1)/(m-1)
N=1+m1+m2+m3+...+mh−1=(mh−1)/(m−1)
4.度为 m,具有 n 个结点的树的最大高度 h 为 (n - m + 1)
因为已知度为m,那么树中至少有一个结点的子结点数为m;要为了使树的高度最大,度为m的结点的子结点位于同一层,其它层则只放置1个结点。
举例:
- 根结点 – 度数为1的子结点 – 度数为1的子结点 – … – 度数为m的子结点
- 根结点 – 度数为1的子结点 – 度数为m的子结点 – … – 度数为1的子结点
5.度为 m、具有 n 个结点的树的最小高度 h 为[ log_m (n * ( m - 1 ) + 1 ) ]
首先已知:要使一棵树的高度尽量小,那么每层(除第一层和最后一层)的结点数都应满足性质2。第一层是根结点,最后一层只要有结点就行,不一定要填满。
再借助性质3可以推导出:
当树的高度取得最小高度h的时候:总的结点数最多为(mh−1)/(m−1)最少为(mh−1−1)/(m−1)+1。可得到下列不等式:(mh−1−1)/(m−1)<n≤(mh−1)/(m−1)
当树的高度取得最小高度h的时候:\\总的结点数\\最多为 (m^h - 1)/(m - 1) \\最少为(m^{h-1} - 1)/(m - 1) + 1。\\
可得到下列不等式:
(m^{h-1} - 1)/(m - 1) < n ≤ (m^h - 1)/(m - 1)
当树的高度取得最小高度h的时候:总的结点数最多为(mh−1)/(m−1)最少为(mh−1−1)/(m−1)+1。可得到下列不等式:(mh−1−1)/(m−1)<n≤(mh−1)/(m−1)
然后要明确,求最小高度的位置应该是结点数最多的位置,防止错误的估计高度。因此得到如下临界状态
n=(mh−1)/(m−1)hmin是整数,向上取整取最小值,求解得:hmin=⌈logm(n(m−1)+1)⌉
n = (m^h - 1)/(m - 1)\\
h_{min}是整数,向上取整取最小值,求解得:\\
h_{min} = ⌈log_m (n(m−1)+1)⌉
n=(mh−1)/(m−1)hmin是整数,向上取整取最小值,求解得:hmin=⌈logm(n(m−1)+1)⌉
**森林中有k颗树,总结点数为n,总边数为e,那么 k = n - e。或者说森林中结点数不变,边数减少 1,则森林中的树的棵数增加 1 **
在一棵树中,结点数为 n,边数必然是 n−1。森林是若干棵树的集合,因此森林中包含若干棵互不连通的子树。设森林中结点数为 n,边数为 e,树的棵数为 k,则有:树的棵数 k = n − e。
推导:
每棵树单独结点数为ni,对应边数为ni−1森林中所有树的结点数和为:∑i=1kni=n森林中所有树的边数和为:e=∑i=1k(ni−1)=∑i=1kni−k=n−k所以森林中树的棵树k=n−e
每棵树单独结点数为 n_i,对应边数为 n_i−1 \\
森林中所有树的结点数和为:\sum_{i=1}^k n_i = n \\
森林中所有树的边数和为:e = \sum_{i=1}^k(n_i - 1) = \sum_{i=1}^kn_i - k = n - k \\
所以森林中树的棵树k = n - e
每棵树单独结点数为ni,对应边数为ni−1森林中所有树的结点数和为:i=1∑kni=n森林中所有树的边数和为:e=i=1∑k(ni−1)=i=1∑kni−k=n−k所以森林中树的棵树k=n−e