算法导论学习笔记——第13章 红黑树

红黑树

红黑树是一种二叉查找树,但在每个结点上增加一个存储位存储结点的颜色,可以是red或black。通过对任意一条从根到叶的路径上结点颜色的限制,红黑树确保没有任何一条路径比其他路径长出两倍,因而是接近平衡的。

每个结点包含5个域,color,key,left,right,p

满足以下红黑性质:

1、每个结点是红色或黑色

2、根结点是黑色

3、每个叶结点(nil)是黑色

4、如果一个结点是红色,那么它的两个子结点都是黑色

5、对每个结点,从该结点到它每个子孙结点的路径上,黑结点数目相同

 

左旋转

 1 LEFT-ROTATE(T,x)
 2 y←right[x]
 3 right[x]←left[y]
 4 p[left[y]]←x
 5 p[y]←p[x]
 6 if p[x]==nil[T]
 7     then root[T]←y
 8     else if x=left[p[x]]
 9         then left[p[x]]←y
10         else right[p[x]]←y
11 left[y]←x
12 p[x]←y

插入

 1 RB-INSERT(T,z)
 2 y←nil[T]
 3 x←root[T]
 4 while x!=nil[T]
 5     do y←x
 6         if key[z]<key[x]
 7             then x←left[x]
 8             else x←right[x]
 9 p[z]←y
10 if y=nil[T]
11     then root[T]←z
12     else if key[z]<key[y]
13         then left[y]←z
14         else right[y]←z
15 left[z]←nil[T]
16 right[z]←nil[T]
17 color[z]←RED
18 RB-INSERT-FIXUP(T,z)
19 
20 //保持红黑性质
21 RB-INSERT-FIXUP(T,z)
22 while color[p[x]]=RED
23     do if p[z]=left[p[p[z]]]
24         then y←right[p[p[z]]]
25             if color[y]=RED
26                 then color[p[z]]←BLACK
27                     color[y]←BLACK
28                     color[p[p[z]]]←RED
29                     z←p[p[z]]
30                 else if z=right[p[x]]
31                     then z←p[x]
32                         LEFT-ROTATE(T,z)
33                 color[p[z]]←BLACK
34                 color[p[p[z]]]←RED
35                 RIGHT-ROTATE(T,p[p[z]])
36             else ( same as then clause with "right" and "left" exchanged )
37 color[root[T]]←BLACK

 

删除

 1 RB-DELETE(T,z)
 2 if left[z]=nil[T] or right[z]=nil[T]
 3     then y←z
 4     else y←TREE-SUCCESSOR(z)
 5 if left[y]!=nil[T]
 6     then x←left[y]
 7     else x←right[y]
 8 p[x]←p[y]
 9 if p[y]=nil[T]
10     then root[T]←x
11     else if y=left[p[y]]
12         then left[p[y]]←x
13         else right[p[y]]←x
14 if y!=z
15     then key[x]←key[y]
16         copy ys satellite data into z
17 if color[y]=BLACK
18     then RB-DELETE-FIXUP(T,x)
19 return y
20 
21 //保持红黑性质
22 RB-DELETE-FIXUP(T,x)
23 while x!=root[T] and color[x]=BLACK
24     do if x=left[p[x]]
25         then ω←right[p[x]]
26             if color[ω]=RED
27                 then color[ω]=BLACK
28                     color[p[x]]←RED
29                     LEFT-ROTATE(T,p[x])
30                     ω←right[p[x]]
31             if color[left[ω]]=BLACK and color[right[ω]]=BLACK
32                 then color[ω]←RED
33                     x←p[x]
34                 else if color[right[ω]]=BLACK
35                     then color[left[ω]]←BLACK
36                         color[ω]←RED
37                         RIGHT-ROTATE(T,ω)
38                         ω←right[p[x]]
39             color[ω]←color[p[x]]
40             color[p[x]]←BLACK
41             color[right[ω]]←BLACK
42             LEFT-ROTATE(T,p[x])
43             x←root[T]
44         else ( same as then clause with "right" and "left" exchanged )
45 color[x]←BLACK

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。