算法导论 B.5 Exercises 答案

B.5-1

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

x 为根的有序树如下:

x 为根的二叉树如下:

B.5-2

由于存在 v0V,vVv0 v 都存在路径。因此 G 的无向图版本 G 是一个连通图。

考虑使用反证法证明这是一棵树。假设 G 中存在一个环 u0,u1,,ui,ui+1,,uk,其中 u0=uk=u,uV

那么,由于 G 是 DAG,从 v0 u 将有一条路径。那么同样的,从 v0 vi,vi+1 都有各自的路径。

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

由于无向图 G 存在环,考虑为边 (ui,ui+1) 标记上箭头。可见,如果标记的是 ui+1ui,那么从 u ui 存在两条有向路径 v0,,u,u1,,ui v0,,u,uk1,,ui+1,ui,违反了路径中的唯一性;反之亦然。

因此,这个连通图 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 度节点 v0。此时 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 度节点 v0。那么 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) 的关系。

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

B.5-5

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

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

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

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

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

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

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

h(n+1)mink=1n1{max(h(k),h(nk))+1}

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

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)

那么有:

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(A)=2(I(L)+2I(R)+1)=2I(T)(B)

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

原结论成立。

B.5-7

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

为方便描述,令 l(T) 表示树 T 中的所有叶节点。那么本题的目标则是证明 xl(T)w(x)1

考虑一棵空树 E,没有叶节点。因此 xl(E)w(x)=01,原结论成立。

考虑一棵只有一个节点的树 O,恰好有一个叶节点。因此 xl(O)w(x)=11,原结论成立。

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

那么根据刚刚的假设,可以得到 xl(L)w(x)+xl(R)w(x)2

因此,有 xl(T)w(x)=12(xl(L)w(x)+xl(L)w(x))122=1

原结论成立。

B.5-8

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

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

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

假设不存在任何节点 uV,使得 L3S(u)2L3 成立。也就是说,对于所有节点 u,要么 S(u)<L3,要么 S(u)>2L3

考虑构造树 T 中一条从根节点到某个叶子的路径 v0,v1,v2,,vd,其中 v0=r,vd 是某个叶子,即 S(vd)=1。对于 0i<d,构造方式如下:

  • 如果 vi 有两个子节点,设其为 li,ri。如果 S(li)S(ri),那么 vi+1=li,否则 vi+1=ri
  • 如果 vi 有一个子节点,那么 vi+1 vi 的那个唯一一个子节点。

那么按照这个构造方式,0i<d,S(vi+1)S(vi)12 都成立。因此序列 {S(vi)} 是一个不递减序列。

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

因此原结论成立。