跳转至

第二章 树与最优树

2.1 树的概念与性质

树与森林的概念

  • 无圈图(acyclic graph):不含圈的图称为无圈图。

  • 树(tree):树是连通的无圈图。

  • 森林(forest):无圈图 \(G\) 称为森林。

    • 树与森林都是简单图;

    • 树与森林都是偶图(二部图)。

  • 平凡树与非平凡树:

    • 平凡树:只有一个顶点的图/树(即阶为 \(1\) 的树);

    • 非平凡树:阶数大于等于 \(2\) 的树。

  • 树叶与分支点:

    • 树中度为 \(1\) 的顶点称为 树叶(leaf) 或悬挂点;

    • 树中度大于 \(1\) 的顶点称为 分支点(branching vertex) 或内点。

树的性质

  • 定理1:每棵非平凡树至少有两片树叶。

  • 定理2:图 \(G\) 是树当且仅当 \(G\) 中任意两点都被唯一的路连接。

  • 定理3:设 \(T\) 是 \((n,m)\) 树,则 \(m=n-1\)

    • 该定理可通过对顶点数 \(n\) 作数学归纳法证明。

    • 推论:具有 \(k\) 个分支的 \(n\) 阶森林有 \(n-k\) 条边。

  • 定理4:每个 \(n\) 阶连通图的边数至少为 \(n-1\)。

    • 当 \(G\) 是树时,边数恰为 \(n-1\),因此树也被称为 最小连通图。
  • 定理5:任意树 \(T\) 的两个不邻接顶点之间添加一条边后,可以得到唯一圈。

  • 定理6:设 \(S=\{d_1,d_2,\ldots,d_n\}\) 是 \(n\) 个正整数序列,它们满足 \(d_1\geq d_2\geq\cdots\geq d_n\) 且 \(\sum_{i=1}^n d_i=2(n-1)\),则存在一棵树 \(T\),其度序列为 \(S\)。

树的中心与形心

  • 图的顶点的离心率:顶点 \(v\) 到图中其余顶点的最大距离称为 \(v\) 的离心率,记作

    \[ e(v)=\max\{d(u,v)\mid u\in V(G)\} \]
  • 图的直径:所有顶点离心率的最大值称为图的直径,即

    \[ d(G)=\max\{e(v)\mid v\in V(G)\} \]
  • 图的半径:所有顶点离心率的最小值称为图的半径,记作

    \[ r(G)=\min\{e(v)\mid v\in V(G)\} \]
  • 中心点与中心:

    • 中心点:离心率等于半径的点,即满足 \(e(v)=r(G)\) 的顶点;

    • 图的中心:全体中心点的集合。

      • 每棵树的中心由一个点或两个相邻点组成。
  • 树在顶点的分支:设 \(u\) 是树 \(T\) 的任意一个顶点,树 \(T\) 在顶点 \(u\) 的分支是指包含 \(u\) 作为一个叶点的极大子树,其分支数等于顶点 \(u\) 的度数;

  • 顶点的权:树 \(T\) 在 \(u\) 点的分支中边的最大数目称为点 \(u\) 的权;

  • 形心点与形心:

    • 形心点:树 \(T\) 中权值最小的点称为它的一个形心点;

    • 形心:全体形心点的集合。

2.2 生成树

生成树的概念与性质

  • 生成树(spanning tree):图 \(G\) 的一个生成子图 \(T\) 如果是树,称它为 \(G\) 的一棵生成树。

    • 属于生成树 \(T\) 的边称为 \(G\) 关于 \(T\) 的 树枝;

    • 属于 \(G\) 但不属于 \(T\) 的边称为 \(G\) 关于 \(T\) 的 弦/连枝。

  • 生成森林(spanning forest):若图 \(G\) 的生成子图为森林,称它为 \(G\) 的一个生成森林。

  • 定理:每个连通图至少包含一棵生成树。

    • 破圈法:若连通图 \(G\) 中有圈 \(C\),去掉 \(C\) 中一条边后得到的图仍然连通,不断去掉图中的圈,最后得到一个无圈连通生成子图,即为 \(G\) 的一棵生成树。

    • 连通图 \(G\) 的生成树一般不唯一。

生成树的计数

  • 边的收缩(edge contraction):称将 \(e\) 的两个端点合并为一个顶点,并删除所有与该顶点相连的自环边为边 \(e\) 的收缩,得到的图记为 \(G\cdot e\)。

  • 凯莱递推计数法:设 \(e\) 是 \(G\) 的一条边,用 \(\tau(G)\) 表示 \(G\) 的生成树棵数,则有

    \[ \tau(G)=\tau(G-e)+\tau(G\cdot e) \]
    • 包含边 \(e\) 的生成树棵数为 \(\tau(G\cdot e)\);

    • 不包含边 \(e\) 的生成树棵数为 \(\tau(G-e)\)。

    • 缺点:递推计算量大,且不能具体指出每棵生成树。

  • 矩阵树定理:给定图 \(G\),设 \(A\) 是 \(G\) 的邻接矩阵,定义 \(n\) 阶方阵 \(C\),其中:

    \[ c_{ij}=\begin{cases}d(v_i),&i=j\\ -a_{ij},&i\neq j\end{cases} \]

    则 \(G\) 的生成树棵数等于 \(C\) 的任意一个余子式的值。

    • 拉普拉斯矩阵:定理中的矩阵 \(C\) 又称为图的拉普拉斯矩阵(Laplacian matrix),可表示为

      \[ C=D(G)-A(G) \]

      其中 \(D(G)\) 为顶点的度对角矩阵,\(A(G)\) 为邻接矩阵。

  • 完全图的生成树数目(Cayley 公式):\(n\) 阶完全图 \(K_n\) 的生成树棵数为

    \[ \tau(K_n)=n^{n-2} \]
  • 删边完全图的生成树数目:若 \(e\) 为 \(K_n\) 的一条边,则有

    \[ \tau(K_n-e)=(n-2)n^{n-3} \]

回路系统简介

  • 连枝与树枝:设 \(T\) 是连通图 \(G\) 的一棵生成树

    • 连枝:把属于 \(G\) 但不属于 \(T\) 的边称为 \(G\) 关于 \(T\) 的连枝;

    • 树枝:把 \(T\) 中的边称为 \(G\) 关于 \(T\) 的树枝。

  • 基本圈/基本回路:设 \(T\) 是连通图 \(G\) 的一棵生成树,由 \(G\) 对应于 \(T\) 的一条连枝与 \(T\) 中树枝构成的唯一圈 \(C\),称为 \(G\) 关于 \(T\) 的一个基本圈或基本回路。

  • 基本回路组:若 \(G\) 是 \((n,m)\) 连通图,把 \(G\) 对应于 \(T\) 的 \(m-n+1\) 个基本回路称为 \(G\) 对应于 \(T\) 的基本回路组,记为 \(C_f\)。

2.3 最小生成树

最小连接问题

  • 最小生成树(minimum spanning tree):连通边赋权图 \(G\) 中的各边权值之和最小的生成树,称为最小生成树或最小代价树。

  • 常见的最小生成树算法包括:

    1. 克鲁斯克尔算法(Kruskal 算法);

    2. 管梅谷的破圈法;

    3. Prim 算法。

克鲁斯克尔算法(Kruskal 算法)

  • 算法思想:从 \(G\) 中的最小边开始,进行避圈式扩张。

  • 算法流程:

    1. 选择边 \(e_1\),使得其权值最小;

    2. 若已经选定边 \(e_1,e_2,\ldots,e_k\),则从 \(E\setminus\{e_1,e_2,\ldots,e_k\}\) 中选择边 \(e_{k+1}\),使得:

      • \(G[\{e_1,e_2,\ldots,e_{k+1}\}]\) 为无圈图;

      • 使 \(e_{k+1}\) 的权值尽可能小;

    3. 当选定 \(n-1\) 条边(步骤 2 不能继续进行)时停止。

  • 由克鲁斯克尔算法得到的任何生成树一定是一棵最小生成树。

管梅谷的破圈法

  • 算法流程:

    1. 从赋权图 \(G\) 的任意圈开始;

    2. 去掉该圈中权值最大的一条边(破圈);

    3. 不断破圈,直到图 \(G\) 中没有圈为止;

    4. 最后剩下的 \(G\) 的生成子图即为 \(G\) 的最小生成树。

Prim 算法

  • 算法流程:

    1. 对于连通赋权图 \(G\) 的任意一个顶点 \(u\),选择与点 \(u\) 关联且权值最小的边作为最小生成树的第一条边 \(e_1\);

    2. 若已选定边 \(e_1,e_2,\ldots,e_k\),则从 \(E\setminus\{e_1,e_2,\ldots,e_k\}\) 中选择边 \(e_{k+1}\),使得:

      • \(e_{k+1}\) 有且仅有一个顶点在边导出子图 \(G[\{e_1,e_2,\ldots,e_k\}]\) 中;

      • 使 \(e_{k+1}\) 的权值尽可能小;

    3. 重复执行直至选满 \(n-1\) 条边。由反证法可证明 Prim 算法得到的生成树必为最小生成树。

计算机中的树简介

根树

  • 根树(rooted tree):一棵非平凡的有向树 \(T\),如果恰有一个顶点的入度为 \(0\),而其余所有顶点的入度均为 \(1\),这样的有向树称为根树。

    • 树根:入度为 \(0\) 的顶点;

    • 树叶:出度为 \(0\) 的顶点;

    • 内点:入度为 \(1\)、出度大于 \(1\) 的顶点;

    • 分支点:内点和树根统称为分支点。

    • 注:根树常画成倒置形式,方向由上指向下。

  • 树的层数与树高:

    • 层数:顶点 \(v\) 到树根的距离称为点 \(v\) 的层数(树根为 \(0\) 层);

    • 树高:所有顶点中层数的最大者称为根树 \(T\) 的树高。

  • 有序树与子根树:

    • 有序树:若规定了每层顶点的访问次序(一般次序为从左至右),这样的根树称为有序树;

    • 子根树:由点 \(v\) 及其后代导出的子图称为根树的子根树。

\(k\) 元根树

  • \(k\) 元根树与完全 \(k\) 元树:

    • \(k\) 元根树:每个分支点至多有 \(k\) 个子节点的根树;

    • 完全 \(k\) 元树:每个分支点恰有 \(k\) 个子节点的根树。

    • 完全 \(k\) 元树性质:在完全 \(k\) 元树 \(T\) 中,若树叶数为 \(t\),分支点数为 \(i\),则

      \[ (k-1)i=t-1 \]

二元树

  • 二元树(binary tree):即 \(2\) 元根树。

  • 有序树转化为二元树的步骤:

    1. 从根开始,保留每个父节点同其最左子节点的连线,撤销与其他子节点的连线;

    2. 兄弟节点间用从左至右的有向边连接;

    3. 直接位于给定节点下方的子节点作为左子节点,同一下级水平线上与给定节点右邻的节点作为右子节点。

  • 二元树的遍历:系统访问根节点使得每个节点恰好访问一次的常用方法:

    • 先根次序遍历(先序遍历):访问根 \(\to\) 按先根次序遍历根的左子树 \(\to\) 按先根次序遍历根的右子树(先左后右);

    • 中根次序遍历(中序遍历):按中根次序遍历根的左子树 \(\to\) 访问根 \(\to\) 按中根次序遍历根的右子树;

    • 后根次序遍历(后序遍历):按后根次序遍历根的左子树 \(\to\) 按后根次序遍历根的右子树 \(\to\) 访问根。

  • 二元树的权:设 \(T\) 是一棵二元树,若对所有 \(t\) 片树叶赋权值 \(w_i\)(\(1\leq i\leq t\)),且权值为 \(w_i\) 的树叶层数为 \(L(w_i)\),称

    \[ W(T)=\sum_{i=1}^t w_i L(w_i) \]

    为该赋权二元树的权。

  • 最优二元树(哈夫曼树):在所有赋权为 \(w_i\) 的二元树中,\(W(T)\) 最小的二元树称为最优二元树。

  • 哈夫曼算法(Huffman 算法):

    1. 初始:令集合 \(S=\{w_1,w_2,\ldots,w_t\}\);

    2. 从 \(S\) 中取出两个权值最小者 \(w_i\) 与 \(w_j\),画结点 \(v_i\)(带权 \(w_i\))和结点 \(v_j\)(带权 \(w_j\)),画 \(v_i\) 与 \(v_j\) 的父节点 \(v\),连接 \(v_i\) 与 \(v\)、\(v_j\) 与 \(v\),令 \(v\) 带权 \(w_i+w_j\);

    3. 令 \(S=(S\setminus\{w_i,w_j\})\cup\{w_i+w_j\}\);

    4. 判断 \(S\) 是否只含一个元素,若是则停止,否则转步骤 2。