红黑树删除某个节点的方法

红黑树节点的删除分为两步:

第一步与二叉查找树的删除操作相似,第二步为调整节点的着色,使其满足红黑树性质。  

节点删除

首先查找待删除的节点z,找到它的位置,此时有如下情况需要考虑:  

  • 节点z为根节点,即节点z的父节点为NIL节点  
  • 节点z的两个孩子均为NIL节点  
  • 节点z的两个孩子中仅有一个孩子为NIL  
  • 节点z的两个孩子都不是NIL

下面分别讨论以上情况:

  • 情况1:删除节点z并将红黑树的根节点置为NIL。
  • 情况2:删除节点z并将z的父节点中指向z的指针指向NIL。
  • 情况3:将节点z的父节点中指向z的指针指向节点z唯一的孩子,然后删除z。
  • 情况4:找到节点z的右子树的最左非NIL节点y,此节点是节点z的中序后继节点,是大于节点z的最小节点。此时节点y的左孩子为NIL。将节点y中的Key值字段覆盖节点z中Key值。假设此时节点y的右孩子为x(NIL或者非NIL),那么将x的parent域指向节点y的父节点p,将节点p中指向y的指针指向x。最后删除节点y。示意图如下:

着色调整  

着色调整可以分如下情况进行分析,假设被删除的节点命名为Y,顶替节点Y的节点为X(如情况2中被删除的节点为z,顶替节点z的节点为NIL;情况3中被删除的节点为z,顶替的节点为z的一个孩子;情况4中被删除的节点为y,顶替的节点为x):  

  • 被删除的节点为根节点  

             满足红黑性质,无需着色调整。  

  • 被删除的节点不是根节点  

             被删除的节点是红色的此时被删节点的父节点和孩子节点均为黑色的,所以不会出现红色节点的子节点也为红色的情况。并且红色节点不影响黑高。所以此种情况满足红黑性质,无需着色调整。  

  • 被删除的节点是黑色的

              此时节点X以及节点Y的父节点可能同时为红,并且删除黑节点之后会影响以Y为根的子树的黑高。此时Y的父节点的黑高至少为2(节点Y、NIL节点),所以X的兄弟节点必定不是NIL(反证法:若X的兄弟节点为NIL那么它的黑高为1,违反红黑性质5)。以X为根的子树的黑高比以Y的兄弟节点为根的黑高小1。示意如图:

此时进行如下讨论:  

  • 节点X为红色

             将节点X着色为黑即可解决上面两个冲突。如图:

  • 节点X为黑色

             找到节点X的兄弟节点S,判断节点S的着色

  • 若节点S为红色

              此时节点X的父节点必定为黑色,并且S必定存在两个非NIL子节点(因为节点S对右子树的黑高没有贡献,而左子树的黑高至少为2)。转换示意图如下:

             其中SL和SR非NIL,并且黑高比X的黑高大1。首先将S着色为黑,P节点着色为红,对节点P进行左旋操作(若节点S是左节点X是右节点时做右旋操作)。此时以节点X为根的子树与子树SL相比仍然有黑高为1的差距。重新判断节点X的兄弟节点的着色,重复上述步骤。

  • 若节点S为黑色  

             节点S的父节点P为红色对节点P做左旋操作即可(若S为P的左孩子则做右旋操作)。示意如图:

  • 节点S的父节点P为黑色
  • 若节点S的两个子节点均为黑色  

              将S节点着色为红,此时S所在子树黑高减1.

  • 若节点S的右子节点为红并且X为父节点的左子节点,或者当节点S的左子节点为红并且X为父节点的右子节点

         如图:

在这种情况下不需要关心S节点的左子节点(右子节点)。将S节点的右子节点(左子节点)着色为黑,然后对P进行左旋(右旋)。此时标记为蓝色的节点的树黑高与节点X的黑高相同。在转换之前S的右子节点的黑高与左子节点的黑高相同,将右(左)子节点着色为黑则将黑高增加了1,正好与P的黑高相同。

  • X为父节点的左(右)子节点时,S的右(左)子节点为黑,S的左(右)子节点为红

             此时将S的左(右)子节点着色为黑,把S节点着色为红,然后将节点S右(左)旋,如图所示:

此时节点X的黑高与其兄弟节点相比仍然相差1,转到上面的情况2.

红黑树节点删除的状态转换图如下:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值