数据结构-树&图树和图的性质
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-树&图树和图的性质相关的知识,希望对你有一定的参考价值。
【注意】不要死记结论,理解推导过程及其背后的思路更重要!
文章目录
1 树的性质
1.1 非平凡树的性质
- 总结点数 = 总度数 + 1(等价于:总结点数 = 总边数/总分支数 + 1)(等价于:若结点总数为 n,则边的数量为 n-1)
【证明】每个结点的度数等于其子结点的个数,即等于与它相连的下一层结点的个数,因此可以推得:某一层的总度数等于下一层结点数的个数。假设一棵树的高度为 h 层,把第 1 层、第 2 层、……、第 h-1 层的总度数加起来,得到的是整棵树中,除了根节点以外的总结点数,因此最后的结果需加 1
【推论】对于二叉树,每个结点有 2 个指针域,一个非空指针域对应一个分支(一条边),因此,n 个结点的二叉树有 n-1 个非空指针域,因而可以得知空指针域 = 2n - (n-1) = n+1
- 度为 m 的树中,第 i 层最多有
mi-1
个结点
【例】对于二叉树,第 2 层最多有 22-1 = 21 = 2 个结点,第 5 层最多有 25-1 = 24 = 16 个结点;对于三叉树,第 2 层最多有 32-1 = 31 = 3 个结点,第 5 层最多有 35-1 = 34 = 81 个结点
- 高度为 h 的 m 叉树的最多有(mh-1)/(m-1)个结点,最少有 h 个结点
【证明】最多的情况:m 叉树每一层都排满结点,形成一个满 m 叉树,则结点数一共有
S = mh-1 + mh-2 + … + m2 + m1 + m0 = (mh-1)/(m-1)
最少的情况:每一层都只有 1 个结点
- 高度为 h、度为 m 的树最多有
(mh-1)/(m-1)
个结点,最少有h+m-1
个结点
【证明】最多的情况:度为 m 的树每一层都排满结点,则结点数一共有
S = mh-1 + mh-2 + … + m2 + m1 + m0 = (mh-1)/(m-1)
最少的情况:h-1 层都只有 1 个结点,最后一层有 m 个结点
思考:为什么以上两条性质的条件看起来类似,但结论不一样?
- 具有 n 个结点的 m 叉树的最小高度为
logm(n(m-1)+1)(向上取整)
【证明】要使得高度最小,那么让 m 叉树的每一层都尽可能地排满结点。因此,前 h-1 层排满了所有的结点,结点总个数为
S = mh-2 + mh-3 + … + m2 + m1 + m0 = (mh-1-1)/(m-1)
;对于最后的第 h 层,可以有 1 个到 mh-1 (全部排满)个结点。所以,一棵 m 叉树的总结点数的范围为
(mh-1-1)/(m-1)+1 ≤ n ≤ (mh-1-1)/(m-1)+mh-1
,即(mh-1-1)/(m-1) < n ≤ (mh-1)/(m-1)
,反解出 h 的范围得到:logm(n(m-1)+1) ≤ h < logm(n(m-1)+1)+1
,由于 h 是正整数,因此 h 的取值为logm(n(m-1)+1)(向上取整)
1.2 非空二叉树的性质
- 非空二叉树上的叶子结点数(n0)等于度为 2 的结点数(n2)加 1,即
n0 = n2 + 1
【证明】设度为 0, 1 和 2 的结点个数分别为 n0, n1, n2,结点总数为
n = n0 + n1 + n2
,而总度数为B = n1 + 2n2
。由结论“总结点数 = 总度数 + 1”可知,n = B + 1
,代入得n0 + n1 + n2 = n1 + 2n2 + 1
,化简得n0 = n2 + 1
- 非空二叉树中,第 i 层最多有
2i-1
个结点
【例】对于非空二叉树,第 2 层最多有 22-1 = 21 = 2 个结点,第 5 层最多有 25-1 = 24 = 16 个结点
- 高度为 h 的非空二叉树的最多有
2h-1
个结点,最少有 h 个结点
【证明】最多的情况:二叉树每一层都排满结点,形成一个满二叉树,则结点数一共有
S = 2h-1 + 2h-2 + … + 22 + 21 + 20 = 2h-1
;最少的情况:每一层都只有 1 个结点
1.3 完全二叉树的性质
- 对于高为 h 的完全二叉树,叶子结点只可能出现在第 h-1 层和第 h 层
- 若完全二叉树的一个编号为 i 的结点有左右孩子,则左孩子编号为 2i,右孩子编号为 2i+1
【推论】若完全二叉树的一个编号为 i 的结点有父节点且为父节点的左孩子,则父节点编号为 i/2;若为父节点的右孩子,则父节点编号为 (i-1)/2
- 结点 i 所在层数为
log2i(向下取整)+1
【证明】设结点 i 位于第 h 层,则从第 1 层到第 h-1 层的结点总数为
2h-1-1
,若结点 i 位于第 h 层的第一个位置,则i = 2h-1
;若结点 i 位于第 h 层的最后一个位置,则i = 2h-1
。所以 i 的取值范围为2h-1 ≤ i < 2h
,反解出 h 的范围:log2i < h ≤ log2i+1
,由于 i 是正整数,因此 i 的取值为log2i(向下取整)+1
- 若有度为 1 的结点,则只可能有一个,且该结点只有左孩子而没有右孩子
- 设完全二叉树有 n 个结点,当 n 为奇数时,没有度为 1 的结点;当 n 为偶数时,有且仅有一个度为 1 的结点
【证明】设度为 0, 1 和 2 的结点个数分别为 n0, n1, n2,则结点总数为
n = n0 + n1 + n2 = (n2 + 1) + n1 + n2 = 2n2 + n1 + 1
,求解出n1 = n - 2n2 - 1
,注意到 2n2-1 为奇数,又因为 n1 取值只可能为 0 或 1,因此当 n 为奇数时,n1 为偶数,即为 0;当 n 为偶数时,n1 为奇数,即为 1
- 具有 n 个结点的完全二叉树的高度为
log2(n+1)(向上取整)
或log2n(向下取整)+1
【证明 1】考虑一个高为 h-1 的满二叉树,其结点总数为
2h-1-1
;考虑一个高为 h 的满二叉树,其结点总数为2h-1
。那么一棵高为 h 的完全二叉树的结点总数 n 应位于这两者之间:2h-1-1 < n ≤ 2h-1
,反解出 h 的范围:log2(n+1) ≤ h < log2(n+1)+1
,由于 h 是正整数,因此 h 的取值为log2(n+1)(向上取整)
【证明 2】考虑一个高度为 h-1 的满二叉树,其结点总数为
2h-1-1
,那么高度为 h 的完全二叉树的最少结点个数就是在上式基础上加 1,即2h-1
;而最多结点个数就是将第 h 层全部排满,即2h-1
。因此一棵高为 h 的完全二叉树的结点总数 n 应位于这两者之间:2h-1 ≤ n < 2h
,反解出 h 的范围:log2n < h ≤ log2n+1
,由于 h 是正整数,因此 h 的取值为log2n(向下取整)+1
1.4 森林的性质
- “左孩子右兄弟”:二叉树结点的左孩子是原森林(树)中结点的孩子,二叉树结点的右孩子是原森林(树)中结点的兄弟
设森林 F 对应的二叉树为 B,对应的树为 T,转换规则为“左孩子右兄弟”,则有:
- 若 B 的左子树结点总数有 m 个,右子树结点总数为 n 个,则 F 的第一棵树的结点总数为 m+1 个,F 的其他子树的结点总数为 n 个
- F 或 T 的叶结点对应于 B 中没有左孩子的结点
【证明】由“左孩子右兄弟”规则可知,二叉树结点的左孩子是原森林(树)中结点的孩子。而现在森林(树)的叶结点是没有孩子的,因此对应的二叉树结点也没有左孩子
- 如果在 B 中结点 i 是父结点的右孩子,则在 T 或 F 中结点 i 一定有左兄弟
【证明】在 B 中结点 i 是父结点的右孩子,即父结点的右孩子为结点 i,意味着对应的 T 或 F 中父结点和结点 i 是兄弟关系,也就是说,结点 i 左兄弟是父结点
1.5 树、二叉树、森林的遍历性质
- 树的先根遍历 = 二叉树的先序遍历 = 森林的先根遍历(相当于依次对森林的每棵树进行先根遍历)
- 树的后根遍历 = 二叉树的中序遍历 = 森林的后根遍历(相等于依次对森林的每棵树进行后根遍历)
2 图的性质
2.1 无向图的性质
- n 个顶点、e 条边的无向图的度:
∑TD = 2e
【注意】若设图中度为 0, 1, 2, 3 的结点个数分别为 n0, n1, n2, n3,则
∑TD = 2e = n1 + 2n2 + 3n3
- n 个顶点的简单完全无向图的边数:
n(n-1)/2
条 - 如果 n 个顶点的无向图是非连通图,则最少有 n-1 条边,最多有
n(n-1)/2 + 1
条边
【证明】非连通图的边最多的情况是:由 n-1 个顶点构成的完全无向图有 n(n-1)/2 条边,此时再加入一条边,将最后一个顶点与其他任意一个顶点连接,就得到了
n(n-1)/2 + 1
条边,注意此时的无向图从完全图变为了非连通图
【推论 1】(条件、结论倒置)若无向图的边数小于 n-1 条,则必为非连通图
【推论 2】若一个图有 n 个顶点,且有大于 n-1 条边,则此图一定有环(或称为回路)
- 无向图中的极大连通子图称为连通分量。一个非连通无向图一定有两个或以上的连通分量
- 生成树:连通图的极小连通子图构成了生成树;生成森林:非连通图的连通分量的极小连通子图构成了生成森林
【注意】“极大连通子图”包含了连通分量所有顶点和所有边;“极小连通子图”包含了连通分量所有顶点和(使得子图连通的)最少边数
2.2 有向图的性质
- n 个顶点、e 条边的有向图的度:
∑TD = ∑ID + ∑OD = e + e = 2e
- n 个顶点的简单完全有向图的边数:
n(n-1)
条 - 若 n 个顶点的有向图是强连通图,那么边数最少有 n 条(形成一个环路)
- 有向图中的极大强连通子图称为强连通分量
2.3 存储结构的性质
- 无向图的邻接矩阵:行或列表示顶点的度
- 有向图的邻接矩阵:行表示出度,列表示入度
- 邻接矩阵为 A,则 An[i][j] 表示顶点 i 到顶点 j 的长度为 n 的路径数
- 有向图的邻接表,其边表存储的是出边表(出度)
以上是关于数据结构-树&图树和图的性质的主要内容,如果未能解决你的问题,请参考以下文章