算法导论12.3插入和删除 练习总结
2015-10-06 10:29
176 查看
12.3-1 给出 TREE-INSERT 过程的一个递归版本。
ANSWER:
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:
![](http://img.blog.csdn.net/20151006105454799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
12.3-6 当 TREE-INSERT 中的结点 z 有两个孩子时,应该选择结点 y 作为它的前驱,而不是作为它的后继。如果这样做,对 TREE-DELETE 应该做些什么必要的修改?一些人提出了一个公平策略,为前驱和后继富裕相等的优先级, 这样得到了较好的实验性能。如何对 TREE-DELETE 进行修改来实现这样一种公平策略?
ANSWER:
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通过检测被删除结点左右儿子的高度,来选择前驱还是后继。
相关文章推荐
- poj 1061 扩展欧几里德同余方程求解
- 字符串去空格
- UVA-12657 Boxes in a Line (双向链表)
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- Java的字符串分割的不同实现
- Java的字符串分割的不同实现
- 第一次写博客
- UVA - 10763 Foreign Exchange
- window操作系统快捷键
- 关于C#中params关键字的作用及用法
- Linux 爬虫
- WPF中使用ReportViewer报表
- LeanCloud获取最近会话列表和获取最后一条聊天记录
- 阅读科研文献心得分享(二)
- mybatis 3如何防止SQL注入
- 使用rand()与srand()产生随机数
- [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)
- java中的内部类总结
- MyEclipse10破解replaceJar一步报错解决方案
- C++单链表2