红黑树---删除

还是老样子,先上性质:

性质1. 节点是红色或黑色

性质2. 根是黑色

性质3. 所有叶子都是黑色(叶子是NIL节点)

性质4. 如果一个节点是红的,则它的两个儿子都是黑的

性质5. 从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。

我们定义:

我们由二叉查找树的删除可知,那个最后被真正删除的结点一定是一个只有一个孩子结点或一个孩子结点都没有结点(不懂的可以去查找二叉查找的删除),我们将真正删除的结点为V,其孩子结点U(可能是哨兵结点,也可能是内结点)会替代V删除的位置,U的兄弟结点为S,如果下图所示:


我们先来看一下红黑树中删除一个结点会出现什么情况:

1.如果删除的结点颜色为红色,红黑树的性质不会改变,不用做任何操作

因为你删除的结点为红色,不会影响任何一个路径上的黑高度,不会破坏性质5,同样不会同一路径上的两个连续的红结点,不会破坏性质4

2、如果删除的结点为黑色

如果删除的结点为黑色,经过U路径黑高度会减1,会破坏性质5,同时,如果U与P(V)同样都是红色,那么也会破坏性质4

下面和们就主要说说怎么处理第二种情况,也就是删除结点为黑色,

其中主要的性质还是性质5被破坏,也就是从U结点的路径上黑结点的个数会减1,我们要做的就是想办法使左子树的黑结点的个数加1,(我们假设U是P(U)的左孩子),怎么样做才能使左孩子黑结点个数加1,而右孩子黑结点的个数保持不变,并使右孩子不会破坏性持4(存在两个连续的红结点)?

分析:

现在我们要做的就是怎么使上面被删除的树满足红黑树的性质,有下面几种情况讨论:(由于删除结点V为红色不影响,这里不再讨论)

如果我们删除的结点为黑色,会破坏红黑树性质,如果上面所讲到的,怎么才能使经过被删除结点的路径上的黑高度与删除之前是平衡的呢?

1.如果U是红色,或是根结点,可都满足两者,此时,我们可直接将U染黑,不再做任何操作

如果U为红色,无论P为何种颜色,将U染黑后些经过此结点的路径上黑高度又加1,与删除前的黑高度相同,满足性质5,且性质4

2.如图:如果U是黑色,我们将P左移S就会被移动到P上方,我们令P为黑色S为原来P的颜色,这样在左孩子上就会多了一个黑结点,下面我们要做的就是让右孩子黑结点的个数没有减少。我们来分几种情况来来分析:

2.1、如果S为红色,当P为红色的情况下,S上移不会破坏红黑树性质,但当P黑色的情况下,上移经过L结点路径上的黑高度会加1,(因为旋转L的父亲为P,因为原来L父亲为红色的S,后来为黑色的P,所以黑高度会加1)

2.2、如果S为黑色,当P为红色的情况下,S上移不会破坏红黑树性质,但当P为黑的情况下,S上移,经过R分支黑结点高度就会少1,因为黑结点P被移到了下方

所以,仅以S颜色不能确定下来固定的方法,所以,我们还要看S的孩子结点,因为在移动后L会作为P结点的孩子结点,而P为黑色结点,所以我们为减少调整L,所以,讨论在S为黑色的情况下,因为S左孩子L移动到P孩子后不会破坏树的结构,所以L颜色不会破坏红黑树的性质,那下面就让我们讨论一下右孩子的情况,无论R为什么色,我们的目的是要让右边的黑高度保持和原来不变,但S为黑色,移动到上面可能变为红色,如果不变为红色,右孩子黑高度不变,但如果变为红色的话,右子树黑高度就会减1

2.2.1、如果 右孩子R为黑色,S在上移后变为红色,右分支黑高度会1,而不能达到与原来平衡的目的

2.2.1、如果右孩子R为红色,S在上移后变为红色,右分支黑高度会减1,我们可以将为红色的右分支R结点改为黑色,这样右分支黑高度就与原来保持不变了

上面讲述的情况也就是下面的几种详细情况的一个说明,下面的四种情况是算法导论上列出的四种情况,只是知道了步骤,可不知道为什么,这里记录一下,也是说明导论上的前三种情况都是在向第四种情况的转换,因为只有转换到第四种情况,才能设置将红黑树的情况一次性满足的设置成功


这里再说一句,删除过种中,主要维护的就是性质5,因为它会破坏了整个树的结构,也是最麻烦的一个,它会使某个分支上的黑高度减小,我们解决的总体思路就是左旋其父亲结点,为其路径上增加一个黑结点,并使其右边分支黑高度不变,这样就使又回复了原来的性质,只是条件比较苛刻

还有像算法导论上的什么双黑结点,红黑结点,都是一种策略,并不存在这种结点,大家看的时候不要被其误解

像具体的四种情况的讨论,这里就不再说了,有好多讲的都要比我说的好,这里也只是从另一个方面记录一下,仅个人理解。。。

参考好多资料,谢谢!

http://dongxicheng.org/structure/red-black-tree/

http://wangdei.iteye.com/blog/236157

http://blog.csdn.net/v_JULY_v/article/details/6105630


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值