算法导论13.1 Exercises 答案
13.1-1
这棵高度为\(3\)的完全二叉搜索树如下:
1 | graph TD |
如下是一棵黑高为\(2\)的红黑树。
1 | graph TD |
如下是一棵黑高为\(3\)的红黑树。
1 | graph TD |
如下是一棵黑高为\(4\)的红黑树。
1 | graph TD |
13.1-2
使用TREE-INSERT插入节点36后的整棵树如图所示。
1 | graph TD |
节点36不可以染成红色,因为节点35是红色节点,不满足性质4。同时,节点36也不可以染成黑色,因为节点35的左子树黑高为\(0\),右子树黑高为\(1\),两棵子树黑高不相同,不满足性质5。
因此,无论将节点36染成什么颜色,它都不是一棵红黑树。
13.1-3
仍然是一棵红黑树。以下是说明对应5个性质仍然保持的原因:
- 因为它只是将根节点从红色染成黑色,而不是染成其它颜色。
- 因为根节点按照这个操作染成黑色了。
- 因为这个过程没有对
NIL节点进行任何操作,它们仍然是黑色的。 - 一开始这棵树的根节点是红色,那么它的两个子节点必定是黑色,现在根节点染成黑色后,就不需要对子节点的颜色做出限制了。
- 因为变化前到变化后,从根节点到每个叶节点的黑色节点数都恰好多了\(1\),因为包括上了叶节点。
13.1-4
当吸收操作完成后,一个黑色子节点的度数可能会变成\(1,2,3,4,5\)。对应如下情况:
- 当前节点是一个
NIL节点,它不会有任何变化。 - 收缩前根节点具有\(2\)个黑色子节点,那么收缩后仍然有\(2\)个子节点。
- 收缩前根节点具有\(1\)个红色子节点,\(1\)个黑色子节点,那么收缩后有\(3\)个子节点;非根节点具有\(2\)个黑色子节点,收缩后将会有\(2\)个子节点和\(1\)个父节点。
- 收缩前根节点具有\(2\)个红色子节点,那么收缩后有\(4\)个子节点;非根节点具有\(1\)个红色子节点,\(1\)个黑色子节点,收缩后将会有\(3\)个子节点和\(1\)个父节点。
- 非根节点具有\(2\)个红色子节点,收缩后将会有\(4\)个子节点和\(1\)个父节点。
此外,收缩后,一棵树的高度至少为原来的一半,因为最好的情况下是一棵完全二叉树中,奇数层是红色节点,偶数层是黑色节点。如此吸收所有红色节点后,树高只剩下一半。
13.1-5
令\(bh(x)\)为以\(x\)为根节点的子树的黑高,\(h(x)\)为以\(x\)为根节点的子树的高。那么按照定义,必有\(h(x)\ge bh(x)\)。根据性质\(4\),从\(x\)到任意叶节点的路径如果包含了一个红色节点,那么这个节点下一个必定是黑色节点,这说明了来自根\(x\)的任意路径上,红色节点的数量一定不超过黑色节点,因此有\(h(x)\le 2bh(x)\)。因此从根到叶子节点的路径中,最长的路径长度至多为最短的\(2\)倍。
13.1-6
当这棵树的节点每一层是红黑交间时,内部节点数最大。这时这棵树是一棵\(2k\)层的完全二叉树,其中偶数层是黑色节点,奇数层是红色节点,一共有\(2^{2k}-1\)个节点。
当这棵树都是黑色节点时,内部节点数最小。这时这棵树是一棵\(k\)层的完全二叉树,一共有\(2^{k}-1\)个节点。
13.1-7
当一棵树所有节点都是黑色时,这个比值最小,为\(0\)。
如果存在正整数\(k\),使得\(n=2^{2k}-1\)成立,那么这棵高度为\(2k\)的二叉完全树为所求,其中偶数层是黑色节点,奇数层是红色节点。此时将达到最大比值\(2\)。因为每个黑色节点都有\(2\)个红色子节点。
13.1-8
考虑使用反证法证明。不失一般性,假设某个红色子节点的左子节点为NIL,那么左子树黑高为\(0\)。如果右子树不为空,那么根据性质4,右子树的根节点是一个黑色节点,向下遍历,最终这棵子树也会有空子节点NIL,因此右子树黑高一定大于\(0\)。由于左子树和右子树黑高不一致,因此不满足性质5,这棵树必定不是一棵红黑树,最终原结论成立。