算法导论12.1 Exercises 答案

12.1-1

对于键的集合\(\{1, 4, 5, 10, 16, 17, 21\}\),高度为\(2,3,4,5,6\)的树分别如图所示:

12.1-2

区别在于,二叉搜索树要求右子树所有的关键字都大于当前节点,而左子树的关键字都小于当前节点,这个定义是针对子树的;而最小堆仅要求两个子节点的关键字都大于当前节点,这个定义是针对子节点的。最小堆的两个子节点在定义上并没有先后的区别,因此如果要设计以\(O(n)\)的时间遍历最小堆按序打印关键字的算法,将会无法做出先遍历左子节点还是右子节点的选择。最终,这个算法无法设计出来。

12.1-3

1
2
3
4
5
6
7
8
9
10
11
12
NONRECURSIVE-INORDER-TREE-WALK(x)
let S be a new STACK
p = x
while not STACK-EMPTY(S) or p != NIL
while p != NIL
PUSH(S, p)
p = p.left
if STACK-EMPTY(S)
p = POP(S)
print p.key
p = p.right

12.1-4

1
2
3
4
5
6
7
8
9
10
11
PREORDER-TREE-WALK(x)
if x ≠ NIL
print x.key
PREORDER-TREE-WALK(x.left)
PREORDER-TREE-WALK(x.right)

POSTORDER-TREE-WALK(x)
if x ≠ NIL
POSTORDER-TREE-WALK(x.left)
POSTORDER-TREE-WALK(x.right)
print x.key

12.1-5

考虑使用反证法证明:如果通过任意一个序列构造一棵二叉搜索树的时间复杂度为\(o(n\lg n)\),那么通过中序遍历这棵二叉搜索树,可以以\(\Theta(n)\)的时间复杂度导出一个有序序列,整个过程的时间复杂度为\(o(n\lg n)+\Theta(n)=o(n\lg n)\),这和原题目条件中基于比较排序的运行时间为\(\Omega(n\lg n)\)矛盾。因此构造任意一个序列的二叉搜索树的时间复杂度为\(\Omega(n\lg n)\)