1. 满足下面红黑性质的二叉搜索树
1、每个节点或是红的或是黑色
2、根节点是黑色
3、每个叶结点是黑色
4、如果一个叶结点是红色,那么它的两个子节点都是黑色的
5、对每个节点,从该节点到其后代叶结点的简单路径上,均包含相同数目的黑色节点。
2. 一棵有n个内部节点的红黑树的高度至多为2lg(n+1)
3. 在对红黑树进行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) 的时间
红黑树
最新推荐文章于 2024-12-11 00:02:12 发布