您的位置:首页 > 理论基础 > 数据结构算法

算法导论-13-1-持久动态集合

2016-06-13 00:00 288 查看
题目:









答:

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;
}
c)时间与空间都是O(h)

e)构造一个结点中没有p域的红黑树,类似于算法导论-13.3-6-红黑树基于栈实现RB-INSERT。对于插入删除中的旋转操作,要对从根结点到旋转结点路径上的所以结点进行更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: