`

红黑树(二)删除

阅读更多
一、红黑树的节点删除



      从红黑树上删除一个节点,可以先用普通二叉搜索树的方法,将节点从红黑树上删除掉,然后再将被破坏的红黑性质进行恢复。

     

      我们回忆一下普通二叉树的节点删除方法:Z指向需要删除的节点,Y指向实质结构上被删除的结点,如果Z节点只有一个子节点或没有子节点,那么Y就是指向Z指向的节点。如果Z节点有两个子节点,那么Y指向Z节点的后继节点(其实前趋也是一样的),而Z的后继节点绝对不可能有左子树。因此,仅从结构来看,二叉树上实质被删除的节点最多只可能有一个子树。

     

      现在我们来看红黑性质的恢复过程:

     

      如果Y指向的节点是个红色节点,那么直接删除掉Y以后,红黑性质不会被破坏。操作结束。


      如果Y指向的节点是个黑色节点,那么就有几条红黑性质可能受到破坏了。首先是包含Y节点的所有路径,黑高度都减少了一(第5条被破坏)。其次,如果Y的有红色子节点,Y又有红色的父节点,那么Y被删除后,就出现了两个相邻的红色节点(第4条被破坏)。最后,如果Y指向的是根节点,而Y的子节点又是红色的,那么Y被删除后,根节点就变成红色的了(第2条被破坏)。


      其中,第5条被破坏是让我们比较难受的。因为这影响到了全局。这样动作就太大太复杂了。而且在这个条件下,进行其它红黑性质的恢复也很困难。所以我们首先解决这个问题:如果不改变含Y路径的黑高度,那么树的其它部分的黑高度就必须做出相应的变化来适应它。所以,我们想办法恢复原来含Y节点的路径的黑高度。做法就是把Y节点的黑色,推到它的子节点X上去。(X可能是NIL节点)。这样,X就可能具有双重黑色,或是同时具有红黑两色,也就是第1条性质被破坏了。


      但第1条性质是比较容易恢复的:一、如果X是同时具有红黑两色,那么好办,直接把X涂成黑色,就行了。而且这样把所有问题都解决了。因为将X变为黑色,2、4两条如果有问题的话也会得到恢复。二、如果X是双黑色,那么我们希望把这种情况向上推一直推到根节点(调整树结构和颜色,X的指向新的双黑色节点,X不断向上移动),让根节点具双黑色,这时,直接把X的一层黑色去掉就行了(因为根节点被包含在所有的路径上,所以这样做所有路径同时黑高减少一,不会破坏红黑特征)。

     

      下面就具体地分析如何恢复1、2、4三个可能被破坏的红黑特性:我们知道,如果X指向的节点是有红黑两色,或是X是根节点时,只需要简单的对X进行一些改变就行了。要对除X节点外的其它节点进行操作时,必定是这样的情况:X节点是双层黑色,且X有父节点P。由知可知,X必然有兄弟节点W,而且这个W节点必定有两个子节点。(因为这是原树满足红黑条件要求而自然具备的。X为双黑色,那么P的另一个子节点以下一定要有至少两层的节点,否则高黑度不可能和X路径一致)。所以我们就分析这些节点之间如何变形,把问题限制在比较小的范围内解决。另一个前提是:X在一开始,肯定是树底的叶节点或是NIL节点,所以在递归向上的过程中,每一步都保证下一步进行时,至少 X的子树是满足红黑特性的。因此子树的情况就可以认为是已经正确的了,这样,分析就只限制在X节点,X的父节点P,X的兄弟节点W,以及W的两个子节点。这些个节点中。


      W以及W的两个子节点C1和C1的一共有五种组合,便有两种情况的处理是一致的,因此调整的过程可以分以下四个情况:


第一种情况:W是红色节点



      如上图,如果W是红色的,那么B和D节点进行一次左旋,并把D(也就是原来的W)着为黑色,B节点(X的父节点)着为红色。然后让W指向X的新兄弟。这样,就把这种情况转化为了W为黑色的情况来解决。在这个变形中,这五个节点之间保持了红黑性质不变,而X指向的双黑色节点的位置和颜色特性都没有变化。变形后的情况如何解决呢?下面的都是W为黑色的问题,因此下面三种中总有一种会合适。


      PS:有没有其它变形呢?有,比如C和D进行右旋,B节点变为红色,变形后五个节点红黑正确的,但是这五个节点与树的其它部分相接处可能会产生问题,这样要考虑的因素就太多了。



第二种情况:W以及W的两个子节点都是黑色的





      如上图,注意,B即可以是红色也可以是黑色。


      这种情况下,把D节点着成红色。然后把X的一个黑色推到父节点B中去,这时X就指向B节点了。变形前后,这五个节点间的黑高是没有变化的。


      唯一可能产生问题的就是如果B原来是红色,那么B和D两个红色相邻就破坏了第4个性质,这样新X的子树就有问题了。这本来不符合我们向上递归的假设。但正好在这种情况下递归就可以结束了。因为B节点原来是红色,现在双加一层黑色,那么X现在指向的这个节点就是红黑两色的,直接把X(也就是B)着为黑色。问题就已经完整解决了。


      如果B节点现在是双层黑色,那就以B为新的X进行向上的下一次的递归。



第三种情况:W的左子节点是红色的且右子节点是黑色。





        如上图,B即可以是黑色也可以是红色。

 

      把C和D进行一次旋转,改变C和D的颜色变形成新的结构。把问题转化成W的右子节点为红色的情况来解决。注意,原来C是红色的,所以C的子节点一定是黑色的,所以旋转中C节点的一个子树挂到之后着为红色的D节点上不会破坏红黑性质。变形后黑高度不变。



  第四种情况:W的右子节点是红色(左子节点可以是红色或黑色)





        如上图,B节点可以是红色或是黑色。

 

      将B和D进行一次左旋,并交换两者的颜色。再将E着为黑色。这时,只要将X的一层黑色脱去,整个问题也得到了解决。递归结束。(在代码上,为了标识递归结束,我们把X指向根节点)



        因此,只要按上面四种情况一直递归处理下去,X最终总会指向根结点或一个红色结点,这时我们就可以结束递归并把问题解决了。


原文来自:http://liyiwen.iteye.com/blog/345799
分享到:
评论

相关推荐

    红黑树的插入与删除_详细整理资料

    ### 红黑树的插入与删除:详细解析 红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年发明,最初被称为“对称二叉B树”。它在1978年Leo J. Guibas和Robert Sedgewick的论文中获得了现代名称“红黑树”。红黑树...

    红黑树-动态演示生成红黑树

    红黑树的插入、删除和查找操作都需要维护这些性质。当插入新节点时,初始设置为红色以避免破坏性质5,然后通过旋转和重新着色等操作来恢复红黑树的平衡。删除操作更加复杂,可能需要对树进行多次调整以保持红黑性质...

    红黑树的源码与测试函数

    1. **myrbtree.c**:这是红黑树的主要实现文件,包含了红黑树节点的定义、插入、删除和查找等操作的代码。其中,节点通常包含键值、颜色、左子节点、右子节点以及父节点等字段。插入和删除操作需要保证红黑树的性质...

    红黑树原理详解

    红黑树的主要特性保证了其在插入、删除和查找操作中的高效性能,通常时间复杂度为O(log n),其中n是树中元素的数量。 红黑树的性质如下: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶节点...

    复习红黑树(二)--红黑树的删除

    以下是红黑树删除节点的一般步骤: 1. **查找并标记待删除节点**:根据键值查找要删除的节点,通常可以通过中序遍历找到。 2. **特殊情况处理**: - 如果要删除的节点是叶子节点(没有子节点),直接删除即可。 -...

    红黑树-使用C++实现-简单练习

    在给定的文件中,"rbtree.cpp"很可能是实现红黑树节点定义和操作的代码,包括旋转、颜色调整、插入和删除等功能。"main.cpp"则是测试和驱动程序,用于验证红黑树实现的正确性。"rbtree.h"可能包含了红黑树的类定义和...

    红黑树添加删除节点操作详解资料整理.doc

    红黑树是一种自平衡二叉查找树,它的设计目标是在保持高效查找性能的同时,通过特定的规则维护树的平衡,确保插入和删除操作的时间复杂度为O(log n)。红黑树的关键特性包括: 1. **每个节点要么是红色要么是黑色**...

    红黑树插入删除算法

    红黑树插入删除算法,算法导论上算法,可以运行

    红黑树的插入与删除、比较完善的

    1. **删除黑色叶子节点**:最简单的情况,直接删除不会影响红黑树的性质。 2. **删除红色节点**:可以通过调整相邻节点的颜色来恢复红黑树的性质。 3. **删除黑色内部节点**:这是最复杂的情况,需要通过一系列操作...

    红黑树完整实现文件

    红黑树的平衡策略主要依赖于旋转操作:左旋、右旋、颜色翻转等,这些操作用于在插入和删除节点后调整树的结构,以确保红黑树的性质得以保持。 在"红黑树完整实现文件"中,可能包含了以下内容: 1. **节点结构**:...

    红黑树和AVL树的实现

    红黑树的插入和删除操作比AVL树更复杂,因为它们涉及颜色翻转和旋转来维护红黑树的性质。例如,插入新节点可能导致不平衡,这时可能需要进行单旋、双旋以及颜色调整。删除节点可能需要更复杂的操作,包括重新染色、...

    红黑树实现源码

    3. 红黑树的删除操作: 删除操作比插入更复杂,因为可能需要重新排列树以保持红黑性质。主要步骤包括: - 查找要删除的节点。 - 替换节点:如果要删除的是叶节点或只有一个孩子的节点,可以直接删除。如果两个...

    红黑树的例子

    红黑树在进行插入和删除操作时,通过特定的算法来维持以下性质: 1. **性质1:** 树中的每个节点要么是红色,要么是黑色。 2. **性质2:** 根节点必须是黑色。 3. **性质3:** 每个叶子节点(NIL节点,空节点)都是...

    红黑树-数据结构

    在红黑树中,每个节点都有两种颜色:红色或黑色,这使得它能够在插入和删除操作后通过特定的调整策略快速恢复平衡。 1. **红黑树的基本性质**: - 每个节点要么是红色,要么是黑色。 - 根节点是黑色。 - 所有...

    基于二分查找树讲解红黑树

    红黑树是一种自平衡的二叉查找树,它在数据结构和算法领域有着重要的应用,尤其是在需要高效查找、插入和删除操作的场景中。它的设计目标是确保任何节点到其每个叶子节点的所有路径都大致相等,从而避免了二叉查找树...

    红黑树、区间树

    红黑树的主要操作包括插入、删除和旋转,其中旋转是维护红黑树性质的关键。 接下来,我们讨论区间树。区间树是一种基于红黑树的高级数据结构,主要用于高效地处理区间查询和更新问题。它继承了红黑树的特性,并在此...

    红黑树java操作代码 红黑树是java里面遍历性能最好数据结构

    同时,会有一个表示红黑树的类,包含插入、删除、查找等方法。`tetsRed.java`可能是测试红黑树功能的文件,用于验证实现的正确性。 在Java中实现红黑树,需要对数据结构有深入理解,并能够熟练运用递归和迭代策略来...

    gcc 红黑树(二叉搜索树 红黑树 动态排序树 精确计时)

    红黑树是一种自平衡二叉查找树,它的设计目的是为了在保持查找效率的同时,尽可能地减少插入和删除操作带来的性能损失。在计算机科学中,它是一种广泛应用的数据结构,特别是在动态排序和高效查找方面。 二叉搜索树...

    彻底明白红黑树

    红黑树的删除操作也可以分为两步:第一步与二叉查找树的删除操作相似,第二步为调整节点的颜色,使其满足红黑树性质。删除节点z首先查找待删除的节点z,找到它的位置,然后将节点z删除,并将红黑树的根节点置为NIL。...

    红黑树的C实现,算法导论的红黑树C实现

    删除后可能需要重新着色和旋转来保持红黑树的性质。 4. 查找操作:在红黑树中查找特定元素,可以沿着根节点开始,根据节点的键值进行比较,遵循二叉查找树的规则。 5. 转换和旋转:红黑树的平衡主要依赖于两种旋转...

Global site tag (gtag.js) - Google Analytics