思考题13-1
a) 对于插入操作,需要更改根结点到插入的新叶结点路径上的所有结点;对于删除操作,至多改变被删除的节点和其后继的祖先结点。
b) 先假设会调用两个子程序MAKE-NEW-NODE(k)
、COPY-NODE(x)
。其中MAKE-NEW-NODE(k)
创建一个关键字为
k
的结点,该结点的左右孩子为空,然后返回一个指向这个结点的指针。COPY-NODE(x)
创建一个和结点
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
个结点,所以需要花费
e) 从 a) 和 c) 我们知道,插入到一颗高为
h
的持久二叉搜索树需要
1) 怎么在没有
parent
的情况下在
O(1)
时间内找到指向父结点的指针。
2) 在红黑树的旋转和着色过程中,需要改变的结点所做的改变不会超过
O(lgn)
。
对于1),我们除了使用和红黑树差不多的RB-INSERT
函数外,还需要一个栈来保存从根结点到插入结点位置所经过的结点,然后将栈传给RB-INSERT-FIXUP
,这样就可以在
O(1)
时间内找到指向父结点的指针;
对于2),证明略。
同样的也可以相似的证明删除持久的红黑树最坏只要
O(h)
时间。
思考题13-2
暂略
思考题13-3
暂略
思考题13-4
暂略