算法导论B.5 Exercises 答案

B.5-1

自由树和以\(x\)为根的有根树如下:

\(x\)为根的有序树如下:

\(x\)为根的二叉树如下:

B.5-2

由于存在\(v_0\in V,\forall v \in V\)\(v_0\)\(v\)都存在路径。因此\(G\)的无向图版本\(G'\)是一个连通图。

考虑使用反证法证明这是一棵树。假设\(G'\)中存在一个环\(\langle u_0,u_1,\dots,u_i,u_{i+1},\dots,u_k\rangle\),其中\(u_0=u_k=u,u\in V\)

那么,由于\(G\)是DAG,从\(v_0\)\(u\)将有一条路径。那么同样的,从\(v_0\)\(v_i,v_{i+1}\)都有各自的路径。

如图,虚线箭头\(u\rightarrow v\)表示这\(u\)\(v\)有路径可达,实线箭头则意味着有一条有向边从\(u\)\(v\)

由于无向图\(G'\)存在环,考虑为边\((u_i,u_{i+1})\)标记上箭头。可见,如果标记的是\(u_{i+1}\rightarrow u_i\),那么从\(u\)\(u_i\)存在两条有向路径\(\langle v_0,\dots,u,u_1,\dots,u_i\rangle\)\(\langle v_0,\dots,u,u_{k-1},\dots,u_{i+1},u_i\rangle\),违反了路径中的唯一性;反之亦然。

因此,这个连通图\(G\)不应该存在环,因此\(G\)是一棵树。

B.5-3

假设\(F(T)\)是二叉树\(T\)中的\(2\)度节点数,\(G(T)\)是二叉树\(T\)的叶子节点数。那么问题转化成证明对于所有二叉树\(T\),都有\(F(T)=G(T)-1\)

考虑只有一个节点的树\(O\),那么\(F(O)=0,G(O)=1,F(O)=G(O)-1\)成立。

以下分别按照两种情况归纳:

1

由上图构造出来的树中,左子树\(L\)或者右子树\(R\)为空。不失一般性,假设非空的是\(L\)。那么新构造的树\(T\)中,多了一个\(1\)度节点\(v_0\)。此时\(F(T)=F(L),G(T)=G(L)\),仍有\(F(T)=G(T)-1\)

2

新构造出来的树中,左子树\(L\)或者右子树\(R\)都非空。那么有\(F(L)=G(L)-1,F(R)=G(R)-1\)。那么新构造的树\(T\)中,多了一个\(2\)度节点\(v_0\)。那么\(F(T)=F(L)+F(R)+1,G(T)=G(L)+G(R)\)

那么有:

\(F(T)=F(L)+F(R)+1=G(L)-1+G(R)-1+1=G(L)+G(R)-1=G(T)-1\)

因此原结论成立。

假设\(I(T)\)是满二叉树\(T\)的内部节点数,\(J(T)\)是满二叉树\(T\)的叶子节点数。那么问题转化成证明对于所有满二叉树\(T\),都有\(I(T)=J(T)-1\)

考虑只有一个节点的树\(O\)(可以发现这是满二叉树)。那么\(I(O)=0,J(O)=1,I(O)=J(O)-1\)成立。

如果\(L,R\)都是满二叉树,那么如图构造的树\(T\)一定也是满二叉树。

目前已经满足\(I(L)=J(L)-1,I(R)=J(R)-1\),考虑\(I(T)\)\(J(T)\)的关系。

不难发现,\(v_0\)\(T\)的内部节点,因此\(I(T)=I(L)+I(R)+1\)。而叶子节点数直接相加即可,因此有\(J(T)=J(L)+J(R)\)

那么有:

\(I(T)=I(L)+I(R)+1=J(L)-1+J(R)-1+1=J(L)+J(R)-1=J(T)-1\)

因此原结论成立。

B.5-4

本题将使用数学归纳法进行证明。假设构造出的\(k\)个叶节点的满二叉树为\(T(k)\)

\(k=1\)时,不难发现只有\(1\)个节点的树为满二叉树\(T(1)\),此时恰有一个叶节点。

\(k>1\)时,假设从\(1\sim k-1\)个叶节点的满二叉树都能构造出,考虑题目8.5-3中的图。令\(L=T(1),R=T(k-1)\),那么节点\(v_0\)的度数为\(2\),因此不是叶子节点。由\(v_0,L,R\)新构造出的树恰好维持着满二叉树的性质,并且有\(1+(k-1)=k\)个叶子节点。这颗新构造出来的满二叉树即为\(T(k)\)

B.5-5

\(h(n)\)为有\(n\)个节点的二叉树的高度的下界。也就是说,目标是证明\(h(n)\ge\lfloor \lg n\rfloor\)

可以发现对于\(n>1\)\(h(n)\ge h(n-1)\)必定成立。因为节点数越多,数的深度的下界肯定越高。

当树只有\(n=1,2\)个节点时,树的高度为恰好为\(\lg n\),原结论成立。

假设对于\(\forall i,1\le i\le n\),原结论均成立。考虑\(n+1\)个节点时的树。

\(n+1\)不是\(2\)次幂时,有\(\lfloor \lg n\rfloor=\lfloor \lg (n+1)\rfloor\)。那么\(h(n+1)\ge h(n)\ge \lfloor \lg n\rfloor=\lfloor \lg (n+1)\rfloor\)。证明结束。

否则,假设左子树有\(k\)个节点,那么右子树有\((n+1)-1-k=n-k\)个节点。

那么按照题目8.5-3中的图,可以得到,\(\forall 1\le k< n,h(n+1)\ge \max(h(k),h(n-k))+1\)成立。即:

\[h(n+1)\ge \min_{k=1}^{n-1}\{\max(h(k),h(n-k))+1\}\]

那么当\(k=(n+1)/2\)时,上面的最小值能够取到。因此有\(h(n+1)\ge h((n+1)/2)+1 \ge \lfloor\lg (n+1)-1\rfloor+1\ge \lfloor\lg(n+1)\rfloor\)。原结论成立,证明结束。

\(\star\) B.5-6

本题将使用数学归纳法进行证明。

假设\(I(T)\)是满二叉树\(T\)的内部节点数,\(J(T)\)是满二叉树\(T\)的叶子节点数,\(i(T)\)为树的内部路径,\(e(T)\)为树的外部路径。那么原结论化为,证明对于所有的满二叉树\(T\),都有\(i(T)-e(T)=2I(T)\)

考虑只有一个节点的树\(O\)(可以发现这是满二叉树)。有\(i(O)=e(O)=I(O)=0\),因此\(i(O)-e(O)=2I(O)\)成立。

如题目8.5-3中的图所示,如果\(L,R\)都是满二叉树,那么构造的树\(T\)一定也是满二叉树。注意到,当\(T\)如此被构造后,原来属于子树\(L,R\)中所有节点的深度都增加了\(1\)。并且都满足\(i(L)-e(L)=2I(L),i(R)-e(R)=2I(R)\)

那么根据\(i\)的定义可以写出\(i(T)=i(L)+i(R)+I(L)+I(R)\)。注意后面两项产生的原因是:由于\(T\)构造出来后,左子树的\(I(L)\)个内部节点和右子树的\(I(R)\)个节点深度都增加了\(1\)

类似的,根据\(e\)的定义,可以写出\(e(T)=e(L)+e(R)+J(L)+J(R)\)

那么有:

\(\begin{aligned} i(T)-e(T)&=e(L)-i(L)+e(R)-i(R)+J(L)-I(L)+J(R)-I(R)\\ &=(e(L)-i(L))+(e(R)-i(R))+(J(L)-I(L))+(J(R)-I(R))\\ &=2I(L)+2I(R)+1+1&\qquad(A)\\ &=2(I(L)+2I(R)+1)\\ &=2I(T)&\qquad(B) \end{aligned}\)

变换\((A)\)使用了题目8.5-3中的结论:\(J(T)-I(T)=1\)。对于变换\((B)\),由于\(v_0\)\(T\)的内部节点,因此\(I(T)=I(L)+I(R)+1\)

原结论成立。

\(\star\) B.5-7

本题将使用数学归纳法进行证明。

为方便描述,令\(l(T)\)表示树\(T\)中的所有叶节点。那么本题的目标则是证明\(\displaystyle{\sum_{x \in l(T)} w(x)\le1}\)

考虑一棵空树\(E\),没有叶节点。因此\(\displaystyle{\sum_{x \in l(E)} w(x) = 0\le1}\),原结论成立。

考虑一棵只有一个节点的树\(O\),恰好有一个叶节点。因此\(\displaystyle{\sum_{x \in l(O)} w(x) = 1\le1}\),原结论成立。

如题目8.5-3中的图所示,假设子树\(L,R\)都满足\(\displaystyle{\sum_{x \in l(L)} w(x) \le1,\sum_{x \in l(R)} w(x) \le1}\)。注意到,新构造出来的树\(T\)中,原来属于子树\(L,R\)中所有节点的深度都增加了\(1\)。这意味着,对于\(L,R\)中所有的叶子节点,其新权值为旧权值的\(\dfrac{2^{-(d+1)}}{2^{-d}}=\dfrac{1}{2}\)

那么根据刚刚的假设,可以得到\(\displaystyle{\sum_{x \in l(L)} w(x) +\sum_{x \in l(R)} w(x) \le2}\)

因此,有\(\displaystyle{\sum_{x \in l(T)} w(x)=\dfrac{1}{2}\left(\sum_{x \in l(L)} w(x)+\sum_{x \in l(L)} w(x)\right)\le \dfrac{1}{2} \cdot 2=1}\)

原结论成立。

\(\star\) B.5-8

本题将使用反证法进行证明。

假设这棵树为\(T\)。由于叶节点数量超过\(2\)。因此根据8.5-3的结论,这棵树必定存在一个内部节点\(r\)。考虑使用\(r\)节点定根,使\(T\)成为一棵有根树。

\(S(u)\)表示以\(u\)为根的子树中,叶节点的个数。那么按照题意有\(S(r)=L\)

假设不存在任何节点\(u \in V\),使得\(\dfrac{L}{3}\le S(u)\le\dfrac{2L}{3}\)成立。也就是说,对于所有节点\(u\),要么\(S(u)<\dfrac{L}{3}\),要么\(S(u)>\dfrac{2L}{3}\)

考虑构造树\(T\)中一条从根节点到某个叶子的路径\(\langle v_0,v_1,v_2,\dots,v_d\rangle\),其中\(v_0=r,v_d\)是某个叶子,即\(S(v_d)=1\)。对于\(0\le i< d\),构造方式如下:

  • 如果\(v_i\)有两个子节点,设其为\(l_i,r_i\)。如果\(S(l_i)\ge S(r_i)\),那么\(v_{i+1}=l_i\),否则\(v_{i+1}=r_i\)
  • 如果\(v_i\)有一个子节点,那么\(v_{i+1}\)\(v_i\)的那个唯一一个子节点。

那么按照这个构造方式,\(\forall 0\le i< d,\dfrac{S(v_{i+1})}{S(v_i)}\ge \dfrac{1}{2}\)都成立。因此序列\(\{S(v_i)\}\)是一个不递减序列。

考虑自顶向下遍历这条路径。如果当前节点\(v_i\)满足\(\dfrac{L}{3}\le S(v_i)\le\dfrac{2L}{3}\),那么\(v_i\)为所求节点,证明结束。否则,如果存在某个\(j,0<j<d\),使得\(S(v_j)>\dfrac{2L}{3},S(v_{j+1})<\dfrac{L}{3}\)成立,那么得到\(\dfrac{S(v_{j+1})}{S(v_j)}< \dfrac{1}{2}\),与构造的\(\{S(v_i)\}\)序列的性质矛盾。

因此原结论成立。