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

 

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

分类: 算法导论   282人阅读  评论(0)  收藏  举报
算法 tree insert c

题目:

算法导论-13-1-持久动态集合_第1张图片

算法导论-13-1-持久动态集合_第2张图片

算法导论-13-1-持久动态集合_第3张图片

算法导论-13-1-持久动态集合_第4张图片


答:

a)需要改变的结点包括“从根结点开始,到要插入到删除的结点”的这条路径上的所有结点。

b)

[cpp]  view plain copy
  1. //持久动态集合上的树的插入操作  
  2. tree* Persistent_Tree_Insert(tree *T, int k)  
  3. {  
  4.     //从根结点开始  
  5.     node *p = T->root, *f, *f2;  
  6.     //首先根结点是一定要改变的  
  7.     T->root = new node(p);  
  8.     //改变p结点的孩子,不需要改变的那个,还是指向原来的孩子  
  9.     while(p->key != k)  
  10.     {  
  11.         if(k < p->key)  
  12.         {  
  13.             //为要改的那个孩子建立一个和它一样的新结点  
  14.             f = p->left;  
  15.             //若孩子为空,把新结点加入进去  
  16.             if(!f)  
  17.                 f2 = new node(k);  
  18.             else  
  19.                 f2 = new node(f);  
  20.             //p指向新孩子  
  21.             p->left = f2;  
  22.         }  
  23.         else  
  24.         {  
  25.             f = p->right;  
  26.             if(!f)  
  27.                 f2 = new node(k);  
  28.             else  
  29.                 f2 = new node(f);  
  30.             p->right = f2;  
  31.         }  
  32.         //以新结点为父结点,做同样的更新操作  
  33.         p = f2;  
  34.     }  
  35.     //返回树  
  36.     return T;  
  37. }  
c)时间与空间都是O(h)

e)构造一个结点中没有p域的红黑树,类似于算法导论-13.3-6-红黑树基于栈实现RB-INSERT。对于插入删除中的旋转操作,要对从根结点到旋转结点路径上的所以结点进行更新。

你可能感兴趣的:(算法导论)