红黑树

一、红黑树性质

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

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

2.根节点是黑色的。

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

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

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


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


一棵有n个内部节点的红黑树的高度之多为2lg(n+1)。


二、旋转

左转
LEFT-ROTATE(T,x)
    y = x.right
    x.right = y.left
    if y.left != NIL
         y.left.p = x
    y.p = x.p
    if x.p == NIL
        T.root = y
    else if x == x.p.left
        x.p.left = y
    else
        x.p.right = y
    y.left = x
    x.p = y

右转
RIGHT-ROTATE(T,x)
    y = x.left
    x.left = y.right
    if y.right != NIL
        y.right.p = x
    y.p = x.p
    if x.p == NIL
        T.root = y
    else if x == x.p.left
        x.p.left = y
    else
        x.p.right = y
    y.right = x
    x.p = y

三、插入

一、父节点z.p是祖父节点z.p.p的左孩子

1、叔叔节点是红色。

处理:将叔叔节点y与父节点z.p置为黑色,将祖父节点z.p.p置为红色,继续循环。

2、叔叔节点是黑色,z是父节点z.p的右孩子。

处理:以父节点z.p为轴,做左旋。

3、叔叔节点是黑色,z是父节点z.p的左孩子。

处理:将父节点z.p置为黑色,祖父节点z.p.p置为红色。以祖父节点z.p.p为轴做右旋。

二、父节点z.p是祖父节点z.p.p的右孩子

1、叔叔节点是红色。

处理:将叔叔节点y与父节点z.p置为黑色,将祖父节点z.p.p置为红色,继续循环。

2、叔叔节点是黑色,z是父节点的左孩子。

处理:以父节点z.p为轴做右旋。

3、叔叔节点是黑色,z是父节点的右孩子。

处理:将父节点z.p置为黑色,祖父节点z.p.p置为红色。以祖父节点为轴做左旋。


插入
RB-INSERT(T,z)
    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
    else if 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,z)
				
		z.p.color = BLACK
		z.p.p.color = RED
		RIGHT-ROTATE(T,z.p.p)
	    else
		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.left
		    z = z.p
		    RIGHT-ROTATE(T,z)
				
		    z.p.color = BLACK
		    z.p.p.color = RED
		    LEFT-ROTATE(T,z.p.p)
    T.root.color = BLACK




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值