学习算法导论-红黑树之摘录

1.如果搜索树的高度较低时,这些集合操作会执行得较快。然而,如果树的高度较高时,这些集合可能并不比在链表上执行得快。红黑树(red-black tree)是许多"平衡"搜索树的一种,可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lgn)。

二、红黑树的性质

     红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因为是近似于平衡的。

     2.1 树中每个节点包含5个属性:color、key、left、right和p。如果一个节点没有子节点或父节点,则该节点相应指针属性的值为NIL。我们可以把这些NIL视为指向二叉搜索树的叶节点(外部节点)的指针,而把带关键字的节点视为树的内部节点。

   一棵红黑树是满足下面红黑性质的二叉搜索树:

    1.每个节点或是红色的,或是黑色的。

    2.根节点是黑色的。

    3.每个叶节点(NIL)是黑色的。

    4.如果一个节点时红色的,则它的两个子节点都是黑色的。

    5.对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

    下图(a)显示了一个红黑树的例子:

   

     下图(b)所有指向NIL的指针都用指向哨兵T.nil的指针替换:

        

        我们通常将注意力放在红黑树的内部节点上,因为它们存储了关键字的值。在本章的后面部分,所画的红黑树都忽略了叶节点,下图(c)所示:

       

    2.2 旋转

          搜索树操作TREE-INSERT和TREE-DELETE在含n个关键字的红黑树上,运行花费时间为O(lgn)。由于这两个操作对树进行了修改,结果可能违反红黑性质,为了维护这些性质,必须要改变树中某些节点的颜色以及指针结构。

           指针结构的修改是通过旋转(ratation)来完成的,这是一种能保持二叉搜索树性质的搜索树局部操作。下图中给出了两种旋转:左旋和右旋。


           在LEFT-ROTATE的伪代码中,假设x.right不等于T.nil且根节点的父节点为T.nil。

        

               在旋转操作中只有指针改变,其他所有属性都保持不变.

          

          2.3 插入

             我们可以在O(lgn)时间内完成向一棵含n个节点的红黑树中插入一个新节点。为了做到这一点,利用TREE-INSERT过程的一个略作修改的版本来将节点z插入树T内,就好像T是一棵普通的二叉搜索树一样,然后将z着为红色。为保证红黑性质能继续保持,我们调用一个辅助程序RB-INSERT-FIXUP来对节点重新着色并旋转。调用RB-INSERT(T,z)在红黑树T内插入节点z,假设z的key属性已被事先赋值。

         

         过程TREE-INSERT和RB-INSERT之间有4处不同。第一,TREE-INSERT内的所有NIL都被T.nil代替。第二,RB-INSERT的第14-15行置z.left和z.right为T.nil,以保持合理的树结构。第三,在第16行将z着为红色。第四,因为将z着为红色可能违反其中的一条红黑性质,所以在RB-INSERT的第17行中调用RB-INSERT-FIXUP(T,z)来保持红黑性质。


        为了理解RB-INSERT-FIXUP过程如何工作,把代码分为三个主要的步骤。首先,要确定当节点z被插入并着为红色后,红黑性质中有哪些不能继续保持,其次,应分析第1-15行中while循环的总目标。最后,要分析while循环体中的三种情况,看看它们是如何完成目标的。图13-4给出一个范例,显示在一棵红黑树上RB-INSERT-FIXUP如何操作。

      

       






   2.4 删除

       与n个节点的红黑树上的其他基本操作一样,删除一个节点要花费O(lgn)时间。与插入操作相比,删除操作要稍微复杂些。

        从一棵红黑树中删除节点的过程是基于TREE-DELETE过程而来的。首先,需要特别设计一个供TREE-DELETE调用的子过程TRANSPLANT,并将其应用到红黑树上:

    

    过程RB-TRANSPLANT与TRANSPLANT有两点不同。首先,第一行引用哨兵T.nil而不是NIL。其次,第6行对v.p的赋值是无条件执行:即使v指向哨兵,也要对v.p赋值。实际上,当v=T.nil时,也能给v.p赋值。

   

         

            






猜你喜欢

转载自blog.csdn.net/zhangge3663/article/details/79879471