红黑树

性质

红黑树(red-black tree)是许多“平衡”搜索树中的一种,可以保证在最坏情况下基本动态集合操作的时间复杂度为 O(lgn)

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

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

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

  1. 每个结点或是红色,或是黑色的。
  2. 根结点是黑色的。
  3. 每个叶结点(NIL)是黑色的。
  4. 如果一个结点是红色的,则它的两个子结点都是黑色的。
  5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含形同数目的黑色结点。
以上内容来自《算法导论》 第13章 红黑树 174页

引理 13.1 一棵有n个内部结点的红黑树的高度至多为 2lg(n+1)

插入

RB-INSERT-FIXUP(T,z)
    while z.p.color == RED
        if z.p == z.p.p.left
            y == z.p.p.right
            if y.color == RED
                z.p.color = BLACK
                y.color = BLACK
                z.p.p.color = RED
                z = z.p.p
            else 
                if z == z.p.right
                    z = z.p
                    LEFT-ROTATE(T,z)
                z.p.color = BLACK
                z.p.p.color = RED
                RIGHT-ROTATE(T,z.p.p)
        else(same as then clause with "right" and "left" exchanged)
    T.root.color = BLACK

删除

RB-TRANSPLANT(T,u,v)
    if u.p == T.nil
        T.root = v
    elseif u == u.p.left
        u.p.left = v
    else 
        u.p.right = v
    v.p = u.p
RB-DELETE(T,z)
    y = z
    y-original-color = y.color
    if z.left == T.nil
        x = z.right
        RB-TRANSPLANT(T,z,z.right)
    elseif z.right == T.nil
        x = z.left
        RB-TRANSPLANT(T,z,z.left)
    else 
        y = TREE-MINIMUM(z.right)
        y-original-color = y.color
        x = y.right
        if y.p == z
            x.p = y
        else
            RB-TRANSPLANT(T,y,y.right)
            y.right = z.right
            y.right.p = y
        RB-TRANSPLANT(T,z,y)
        y.left = z.left
        y.left.p = y
        y.color = z.color
    if y-original-color == BLACK
        RB-DELETE-FIXUP(T,x)
RB-DELETE-FIXUP(T,z)
while x != T.root and x.color == BLACK //x结点是双黑色则要去掉一层黑色
    if x == x.p.left
        w = x.p.right
        if w.color == RED
            w.color = BLACK
            x.p.color = RED
            LEFT-ROTATE(T,x.p)
            w = x.p.right
        if w.left.color == BLACK and w.right.color == BLACK
            w.color = RED
            x = x.p
        else
            if w.right.color == BLACK
                w.left.color = BLACK
                w.color = RED
                RIGHT-ROTATE(T,w)
                w = x.p.right
            w.color = x.p.color
            x.p.color = BLACK
            w.right.color = BLACK
            LEFT-ROTATE(T,x.p)
            x = T.root
    else (same as then clause with "right" and "left" exchanged)
x.color = BLACK // x结点是红黑色,则去掉红色
            

橘子stopper
0 声望0 粉丝

引用和评论

0 条评论