题目:
答:
a)需要改变的结点包括“从根结点开始,到要插入到删除的结点”的这条路径上的所有结点。
b)
- //持久动态集合上的树的插入操作
- tree* Persistent_Tree_Insert(tree *T, int k)
- {
- //从根结点开始
- node *p = T->root, *f, *f2;
- //首先根结点是一定要改变的
- T->root = new node(p);
- //改变p结点的孩子,不需要改变的那个,还是指向原来的孩子
- while(p->key != k)
- {
- if(k < p->key)
- {
- //为要改的那个孩子建立一个和它一样的新结点
- f = p->left;
- //若孩子为空,把新结点加入进去
- if(!f)
- f2 = new node(k);
- else
- f2 = new node(f);
- //p指向新孩子
- p->left = f2;
- }
- else
- {
- f = p->right;
- if(!f)
- f2 = new node(k);
- else
- f2 = new node(f);
- p->right = f2;
- }
- //以新结点为父结点,做同样的更新操作
- p = f2;
- }
- //返回树
- return T;
- }
e)构造一个结点中没有p域的红黑树,类似于算法导论-13.3-6-红黑树基于栈实现RB-INSERT。对于插入删除中的旋转操作,要对从根结点到旋转结点路径上的所以结点进行更新。