红黑树

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

 2. 一棵有n个内部节点的红黑树的高度至多为2lg(n+13. 在对红黑树进行update的时候,必须通过**旋转**改变某些节点的颜色以及指针结构以维持红黑树的性质
 LEFT-ROTATE(T,x)
1. y=x.right            // 初始设置 y
2. x.right=y.left       //把y的左子树移接到x的右子树
3. if y.left !=T.nil
4.      y.left.p = x
5. y.p=x.p    //把x的双亲节点链接到y
6. if x.p==T.nil
7.      T.root=y
8. elseif x==x.p.left
9.     x.p.left=y
10. else x.p.right=y
11. y.left=x   //把x放到y的左子树
12. x.p=y

红黑树的插入
RB-INSERT(T,z)
 1. y=T.nil
 2. x=T.root
 3. while x!=T.nil
 4.     y=x
 5.     if z.key<x.key
 6.     x=x.left
 7.     else x=x.right
 8. z.p=y
 9. if y==T.nil
 10.     T.root=z
 11. elseif  z.key<y.key
 12.   y.left=z
 13. else y.right=z
 14. z.left=T.nil
 15. z.right=T.nil
 16. z.color=RED
 17. RB-INSERT-FIXUP(T,z)  //对节点重新进行着色和旋转
RB-INSERRT-FIXUP(T,z)
 1. while z.p color===RED
 2.  if z.p==z.p.p.left
 3.       y=z.p.p.right  // 叔节点 
 4.       if y.color==RED
 5.           z.p.color=BLACK      //case 1 
 6.           y.color=BLACK
 7.           z.p.p.color=RED
 8.           z=z.p.p 
 9.       else if z==z.p.right
 10.              z=z.p
 11.              LEFT-ROTATE(T,z)
 12.              z.p.color=BLACK
 13.              z.p.p.color=RED
 14.              RIGHT-ROTATE(T,z.p.p)
 15.     else(same as then clause with "right" and "left" 
exchanged)
 16.T.root.color=BLACK 
 插入操作总共花费O(lgn) 的时间

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值