红黑树删除

为描述方便,定义下面符号:

D(Delete)待删除节点

S(Sibling)D的兄弟节点

Close(Child of S Closed for D)靠近D的S的子节点

Far(Child of S Far away from D)远离D的S的子节点

P(Parent)D的父节点

DB(Double Black)双黑问题节点(该节点以下黑色树高少1)

R(root)根节点

值得注意的是,根据红黑树定义:

1)红色节点只能是叶子节点或者拥有两个子节点并且都为黑色

2)黑色节点若只有一个子节点,该节点必然是红色,且为叶子节点

以下讨论假设D在右子树上,对称情况类似

删除任何节点时,判断是否为叶子节点,若不是则寻找后继节点,后继节点不存在寻找前驱节点,替换当前删除节点,循环判断

在上述前提下,删除的必定是叶子节点,分三大类情况:

1、D == R,直接设置R为空

2、D为红色,直接设置P对应D的节点为空

3、D为黑色,DB = D,IsExist = true(当黑色问题未解决时),循环判断以下情况:,完成后设置最原始的P的D节点为空(相当于删除节点)

1)DB == R,设置IsExist = false

2)S为红色,此时P、Far、Close必定为黑色,交换P和S颜色,右旋P(问题范围缩小)

3)S为黑色,

i Far和Close均为黑色(或者均不存在),分P为红色或者黑色,前者设置P为黑色,IsExist=false,后者设置DB=p(将双黑问题冒泡),无论哪种情况都设置S为红色

 

ii Close为红色,可转换为iii(循环时的中间情况此时必定不满足红黑树定义,不可能一开始删除的时候D为叶子节点,因为S有一个节点是黑色的,黑高多1),交换S和Close颜色,左旋S

iii Far为红色,交换P和S颜色,右旋P,设置F为黑色,IsExist = false

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值