您的位置:首页 > 其它

算法导论12.3插入和删除 练习总结

2015-10-06 10:29 176 查看
12.3-1 给出 TREE-INSERT 过程的一个递归版本。

ANSWER:
伪代码:
TREE-INSERT(root, z)
if root.key < z.key
if root.right == NIL
root.right = z
z.p = root
else
TREE-INSERT(root.right, z)
else if root.key > z.key
if root.left == NIL
root.left == z
z.p = root
else
TREE-INSERT(root.left, z)


12.3-2 假设通过反复向一棵树中插入互不相同的关键字来构造一棵二叉搜索树。证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1。

ANSWER:因为搜索的路径和插入的路径是相同的,多检查一次结点的值和该关键字是否相等。

12.3-3 对于给定的 n 个数的集合,可以通过先构造包含这些数据的一棵二叉搜索树(反复使用 TREE-INSERT 逐个插入这些数),然后按中序遍历输出这些数的方法,来对它们排序。这个排序算法的最坏情况运行时间和最好情况运行时间各是多少?

ANSWER:

最坏情况是构成链表,时间为 O(n^2)。

最好情况是满二叉树,时间为 O(nlgn)。

12.3-4 删除操作可交换吗?可交换的含义是,先删除 x 再删除 y 留下的结果树与先删除 y 再删除 x 留下的结果树完全一样。如果是,说明为什么?否则,给出一个反例。

ANSWER:



12.3-6 当 TREE-INSERT 中的结点 z 有两个孩子时,应该选择结点 y 作为它的前驱,而不是作为它的后继。如果这样做,对 TREE-DELETE 应该做些什么必要的修改?一些人提出了一个公平策略,为前驱和后继富裕相等的优先级, 这样得到了较好的实验性能。如何对 TREE-DELETE 进行修改来实现这样一种公平策略?

ANSWER:

伪代码:
TREE-DELETE(T, z)
if z.left == NIL
TRANSPLANT(T, z, z.right)
else if z.right == NIL
TRANSPLANT(T, z, z.left)
else
y = TREE-MAXIMUM(z.left)
if y.p ≠ z
TRANSPLANT(T, y, y.left)
y.left = z.left
y.left.p = y
TRANSPLANT(T, z, y)
y.right = z.right
y.right.p = y
通过检测被删除结点左右儿子的高度,来选择前驱还是后继。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: