红黑树
性质
红黑树(red-black tree)是许多“平衡”搜索树中的一种,可以保证在最坏情况下基本动态集合操作的时间复杂度为 O(lgn)
。
红黑树是一棵二叉搜索树,它在两个结点上增加了一个存储位来表示结点的颜色 ,可以是 RED
或 BLACK
,通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于 平衡的 。
树中每个结点包含5个属性:color、key、left、right 和 p。如果一个结点没有子结点或父结点,则该结点相应指针属性的值为 NIL
,我们可以把这些 NIL
视为指向二叉搜索树的叶子结点(外部结点)的指针,而把带关键字的结点视为树的内部结点。
一个红黑树是满足下面 红黑性质 的二叉搜索树:
- 每个结点或是红色,或是黑色的。
- 根结点是黑色的。
- 每个叶结点(
NIL
)是黑色的。 - 如果一个结点是红色的,则它的两个子结点都是黑色的。
- 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含形同数目的黑色结点。
以上内容来自《算法导论》 第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结点是红黑色,则去掉红色
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。