G
N
I
D
A
O
L

【数据结构-树&图】树和图的性质

【注意】不要死记结论,理解推导过程及其背后的思路更重要!

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 个结点

  • 若非空二叉树有 n 个结点,则空指针域有 n+1 个

【证明】若有一棵 n 个结点的非空二叉树,设度为 0, 1 和 2 的结点个数分别为 n0、n1、n2,有n0 = n2 + 1n = n0 + n1 + n2,将n2代入消去,得n = 2n0 + n1 - 1。注意到此时2n0 + n1即为空指针域的总数,因而总结点数比空指针域总数少 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 个顶点的无向图是非连通图,则最少有 0 条边,最多有(n-1)(n-2)/2条边

【证明】n 个顶点的无向图是非连通图,其中 n-1 个顶点构成了一个完全无向图,边数为(n-1)(n-2)/2,剩余一个顶点孤立。
【注】若要保证有 n 个顶点的无向图在任何情况下都是连通的,那么需要(n-1)(n-2)/2 + 1条边。

  • 如果 n 个顶点的无向图是连通图,则最少有n-1 条边,最多有n(n-1)/2条边(每个顶点的度为n-1

  • 无向图中的极大连通子图称为连通分量。一个非连通无向图一定有两个或以上的连通分量

  • 生成树:连通图的极小连通子图构成了生成树;生成森林:非连通图的连通分量的极小连通子图构成了生成森林

【注意】“极大连通子图”包含了连通分量所有顶点和所有边;“极小连通子图”包含了连通分量所有顶点和(使得子图连通的)最少边数

2.2 有向图的性质

  • n 个顶点、e 条边的有向图的度:∑TD = ∑ID + ∑OD = e + e = 2e
  • n 个顶点的简单完全有向图的边数:n(n-1)条(每个顶点的度为2(n-1)
  • 若 n 个顶点的有向图是强连通图,那么边数最少有 n 条(形成一个环路)
  • 有向图中的极大强连通子图称为强连通分量

附:树图及其性质

  • 定义:无环的连通图(“最脆弱的连通图”:只要在树图上任意加一条边,必出现环;只要从树图上删除一条边,图不连通)
  • 树图必存在度为 1 的结点
  • n 个顶点的树图有且仅有 n-1 条边
  • 任何具有 n 个顶点、n-1 条边的连通图是树图

2.3 存储结构的性质

  • 无向图的邻接矩阵:行或列表示顶点的度
  • 有向图的邻接矩阵:行表示出度,列表示入度
  • 邻接矩阵为 A,则 An[i][j] 表示顶点 i 到顶点 j 的长度为 n 的路径数
  • 有向图的邻接表,其边表存储的是出边表(出度)
---EOF---
posted @ 2022-07-31 22:49  漫舞八月(Mount256)  阅读(616)  评论(0编辑  收藏  举报