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

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
通过检测被删除结点左右儿子的高度,来选择前驱还是后继。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值