算法练习五 红黑树下 节点删除(转)

接着算法联系五,实现了红黑树的节点删除功能。

 

补充了五个函数,这里主要将 删除 和 删除修正两个函数给出,其它的就十分简单了。

 

//删除

RBNode* RBDelete(RBNode** proot, RBNode* pnode, RBNode* pguardNode);

 

//删除修正

void RBDeleteFixup(RBNode** proot, RBNode* pnode, RBNode* pguardNode);

 

 

//返回以节点为根的最小元素

RBNode* TreeMinimum(RBNode* pnode, RBNode* pguardNode);

 

//返回以节点为根的最大元素

RBNode* TreeMaxmum(RBNode* pnode, RBNode* pguardNode);

 

//返回节点的后继

RBNode* TreeSuccessor(RBNode* pnode, RBNode* pguardNode);

 

 

  1. //删除   
  2. RBNode* RBDelete(RBNode** proot, RBNode* pnode, RBNode* pguardNode)  
  3. {  
  4.     RBNode* y;  //y为实际要被删除的节点
  5.     RBNode* x;  //x为y的孩子,y最多只有一个孩子
  6.     if ( pnode->pLeft == pguardNode || pnode->pRight == pguardNode )  //左右孩子至少有一个为空
  7.     {  
  8.         y = pnode;  
  9.     }  
  10.     else  //左右孩子都不为空
  11.     {  
  12.         y = TreeSuccessor(pnode,pguardNode);  //y为pnode的后继节点
  13.     }  
  14.     if ( y->pLeft != pguardNode )  //pnode的只有左孩子的情况
  15.     {  
  16.         x = y->pLeft;  
  17.     }  
  18.     else  
  19.     {  
  20.         x = y->pRight;  
  21.     }  
  22.    //删除y开始
  23.     x->pParent = y->pParent;  //用x来替换y
  24.     if ( y->pParent == pguardNode )  
  25.     {  
  26.         *proot = x;  
  27.     }  
  28.     else  
  29.     {  
  30.         if ( y == y->pParent->pLeft )  
  31.         {  
  32.             y->pParent->pLeft = x;  //用x替换y
  33.         }  
  34.         else  
  35.         {  
  36.             y->pParent->pRight = x;  
  37.         }  
  38.     }  
  39.    //删除y结束
  40.     //将pnode的key用y的key替换
  41.     if ( y != pnode )  
  42.     {  
  43.         pnode->key = y->key;  //*这里没有将y的颜色赋值给pnode,这一点十分重要*//  
  44.     }  
  45.     if ( y->color == BLACK )  
  46.     {  
  47.         RBDeleteFixup( proot,x,pguardNode );  //修正性质5
  48.     }  
  49.     return y;  
  50. }  
  51. //删除修正   
  52. void RBDeleteFixup(RBNode** proot, RBNode* px, RBNode* pguardNode)  
  53. {  
  54.     RBNode*  w;   
  55.     while( px != *proot && px->color == BLACK && px != pguardNode )  
  56.     {  
  57.         if ( px == px->pParent->pLeft )   
  58.         {  
  59.             w = px->pParent->pRight;  
  60.             if ( w->color == RED )  //case1  px的兄弟是红色的  
  61.             {  
  62.                 w->color = BLACK;  
  63.                 px->pParent->color = RED;  
  64.                 LeftRotate( proot, px->pParent, pguardNode );  
  65.                 w = px->pParent->pRight;  
  66.             }  
  67.             if ( w->pLeft->color == BLACK && w->pRight->color == BLACK )  
  68.             {   // case2 px的兄弟w是黑色的,并且w的两个孩子都是黑色的  
  69.                 w->color = RED;  
  70.                 px = px->pParent;  
  71.             }  
  72.             else  
  73.             {  
  74.                 if ( w->pRight->color == BLACK )  
  75.                 {  
  76.                     //case3 px的兄弟w是黑色的,w的左孩子是红色的,右孩子是黑色的  
  77.                     w->pLeft->color = BLACK;  
  78.                     w->color = RED;  
  79.                     RightRotate(proot,w,pguardNode);  
  80.                     w = px->pParent->pRight;  
  81.                 }  
  82.                 //case4 px的兄弟w是黑色的,w的左孩子任意色,右孩子是红色的 
  83.                 w->color = px->pParent->color;  
  84.                 px->pParent->color = BLACK;  
  85.                 w->pRight->color = BLACK;  
  86.                 LeftRotate(proot,px->pParent,pguardNode);  
  87.                 px = *proot;  
  88.             }  
  89.         }  
  90.         else    // px == px->pParent->pRight  
  91.         {  
  92.             w = px->pParent->pLeft;  
  93.             if ( w->color == RED )  
  94.             {  
  95.                 w->color = BLACK;  
  96.                 px->pParent->color = RED;  
  97.                 RightRotate( proot, px->pParent, pguardNode );  
  98.                 w = px->pParent->pLeft;  
  99.             }  
  100.             if ( w->pLeft->color == BLACK && w->pRight->color == BLACK )  
  101.             {  
  102.                 w->color = RED;  
  103.                 px = px->pParent;  
  104.             }  
  105.             else  
  106.             {  
  107.                 if ( w->pLeft->color == BLACK )  
  108.                 {  
  109.                     w->pRight->color = BLACK;  
  110.                     w->color = RED;  
  111.                     LeftRotate( proot, w, pguardNode );  
  112.                     w = px->pParent->pLeft;  
  113.                 }  
  114.                 w->color = px->pParent->color;  
  115.                 px->pParent->color = BLACK;  
  116.                 w->pLeft->color = BLACK;  
  117.                 RightRotate(proot, px->pParent, pguardNode );  
  118.                 px = *proot;  
  119.             }  
  120.         }  
  121.           
  122.       
  123.     }//end while loop   
  124.     px->color = BLACK;  
  125. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值