算法导论笔记:13-03红黑树删除

本文详细解析红黑树的删除操作,包括RB-TRANSPLANT和RB-DELETE过程,以及四种情况的删除修复。通过代码和示例阐述了如何在保持红黑树性质的同时删除节点,展示了删除操作的时间复杂度为O(lg n)。
摘要由CSDN通过智能技术生成

       红黑树的删除操作花费O(lg n)时间,删除算法与二叉搜索树的删除类似,首先红黑树的TRANSPLANT版本有些许不同,主要是因为红黑树使用nil结点代替NULL指针造成的:

RB-TRANSPLANT(T, u, v)

       if u.p ==T.nil

              T.root= v

       else  if u== u.p.left

              u.p.left= v

       else u.p.right= v

       v.p = u.p

 

删除操作的代码如下:

RB-DELETE(T.z)                    

       y = z                             

       y-original-color = y.color        

       if z.left == T.nil                

              x = z.right                       

              RB-TRANSPLAN(T, z, z.right)

 

       else if z.right == T.nil           

              x = z.left                        

              RB-TRANSPLAN(T, z, z.left)    

 

       else y = TREE-MINIMUM(z.right)    

             y-original-color= y.color       

             x= y.right                      

             if y.p == z                      

                    x.p= y                           

             else RB-TRANSPLANT(T, y, y.right)    

                    y.right= z.right                

                    y.right.p= y                    

             RB-TRANSPLANT(T,z, y)           

             y.left = z.left                  

             y.left.p= y                     

             y.color= z.color     

          

      if y-original-color == BLACK     

             RB-DELETE-FIXUP(T.x)     

      

调整代码如下:

       RB-DELETE-FIXUP(T, x)                                            

              while x != T.root and x.color == BLACK                          

                     if x == x.p. left                                               

                            w = x.p.right                                                   

                            if w.color == RED                                                

                                   w.color =BLACK                              // case 1                                       

                                   x.p.color =RED                               // case 1                                       

                                   LEFT-ROTATE(T,x.p)                        // case 1                                   

                                   w = x.p.right                                   // case1 

                                       

                            if w.left.color ==BLACK and w.right.color == BLACK             

                                  w.color= RED                                 //case 2                                        

                                  x= x.p                                             //case 2      

                                       

                           else if w.right.color == BLACK                                 

                                         w.left.color = BLACK                       // case 4                                 

                                         w.color = RED                                 // case 4                                         

                                         RIGHT-ROTATE(T,w)                        // case 4                                    

                                         w = x.p.right                                   // case 4   

                                    

                                   w.color = x.p.color                                 // case 3                                  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值