CLRS第十三章思考题

思考题13-1

a) 对于插入操作,需要更改根结点到插入的新叶结点路径上的所有结点;对于删除操作,至多改变被删除的节点和其后继的祖先结点。

b) 先假设会调用两个子程序MAKE-NEW-NODE(k)COPY-NODE(x)。其中MAKE-NEW-NODE(k)创建一个关键字为 k 的结点,该结点的左右孩子为空,然后返回一个指向这个结点的指针。COPY-NODE(x)创建一个和结点 x 所指的结点有相同属性的结点(即有相同 key,left,right )并返回创建的指向这个结点的指针。

PERSISTENT-TREE-INSERT(r, k)
    if r == NIL
        x = MAKE-NEW-NODE(k)
    else x = COPY-NODE(r)
        if k < r.key
            x.left = PERSISTENT-TREE-INSERT(r.left, k)
        else x.right = PERSISTENT-TREE-INSERT(r.right, k)
    return x

初始调用需要将T.root作为第一个参数。

c) 时间复杂度、空间复杂度都为 O(h)

d) 若有 parent 属性,在插入时,所有结点都要被拷贝一次。因为根结点的孩子结点要指向新的根结点,它们的孩子结点又要指向它们,等等。。。由于有 n 个结点,所以需要花费 Ω(n)

e) 从 a) 和 c) 我们知道,插入到一颗高为 h 的持久二叉搜索树需要 O(h),对一颗高为 h=O(lgn) 的红黑树,插入需要 O(lgn) 时间,所以我们需要证明的是如果一颗红黑树是持久的,插入操作可以在 O(lgn) 时间完成。需要证明两个地方:
1) 怎么在没有 parent 的情况下在 O(1) 时间内找到指向父结点的指针。
2) 在红黑树的旋转和着色过程中,需要改变的结点所做的改变不会超过 O(lgn)
对于1),我们除了使用和红黑树差不多的RB-INSERT函数外,还需要一个栈来保存从根结点到插入结点位置所经过的结点,然后将栈传给RB-INSERT-FIXUP,这样就可以在 O(1) 时间内找到指向父结点的指针;
对于2),证明略。
同样的也可以相似的证明删除持久的红黑树最坏只要 O(h) 时间。

思考题13-2

暂略

思考题13-3

暂略

思考题13-4

暂略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值