《算法导论》第13章 红黑树 个人笔记

第13章 红黑树

13.1 红黑树的性质

一颗红黑树是满足下面红黑性质的二叉搜索树:
1. 每个结点或是红色,或是黑色
2. 根结点是黑色的
3. 每个叶结点(NIL)是黑色的
4. 如果一个结点是红色的,则它的两个子结点都是黑色的
5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点

黑高:从某个结点x出发(不含该结点)到达一个叶结点的任意一条简单路径上的黑色结点个数称为该结点的黑高,记为 bh(x)

引理:一颗有n个内部结点的红黑树的高度至多为 2lg(n+1) 。以任一结点x为根的子树至少包含 2bh(x)1 个内部结点

13.2 旋转

LEFT-ROTATE(T,x)
y = x.right
x.right = y.left
if y.left != T.nil
    y.left.p = x
y.p = x.p
if x.p == T.nil
    T.root = y
elseif x == x.p.left
    x.p.left = y
else x.p.right = y
y.left = x
x.p = y

RIGHT-ROTATA(T,x)
y = x.left
x.left = x.right
if y.right != T.nil
    y.right.p = x
y.p = x.p
if x.p == T.nil
    T.root = y
elseif x == x.p.left
    x.p.left = y
else x.p.right = y
y.right = x
x.p = y

13.3 插入

RB-INSERT总共花费 O(lgn) 时间

RB-INSERT(T,x)
y = T.nil
x = T.root
while x != T.nil
    y = x
    if z.key < x.key
        x = x.left
    else
        x = x.right
z.p = y
if y == T.nil
    T.root = z
elseif z.key < y.key
    y.left = z
else y.right = z
z.left = T.nil
z.right = T.nil
z.color = RED
RB-INSERT-FIXUP(T,z)

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,x)
            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

13.4 删除

RB-DELETE总共花费 O(lgn) 时间

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,x)
elseif z.right == T.nil
    x = z.left
    RB-TRANSPLANT(T,z,x)
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,x)
        y.right = z.right
        z.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,x)
while x != T.root && x.color == BLACK
    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 && 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)
T.root.color = BLACK
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值