1212 5,对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。
1313 一个有n个内部结点的红黑树的高度最多为2lg(n+1)
1414"""
15- from at301_bisearchtree import treeMinimum
15+ from at301_bisearchtree import treeMinimum , inOrderWalk
16+
1617__author__ = 'Xiong Neng'
1718
1819
1920class RBTree ():
2021 COLOR_RED = 0
2122 COLOR_BLACK = 1
2223
23- def __init__ (self , root ):
24+ def __init__ (self , root = None ):
2425 self .root = root
2526 self .nil = RBNode ('' , RBTree .COLOR_BLACK )
27+ if root is None :
28+ self .root = self .nil
2629
2730
2831class RBNode ():
2932 """节点元素定义"""
3033
31- def __init__ (self , key , color , p = None , left = None , right = None ):
34+ def __init__ (self , key , color = RBTree . COLOR_RED , p = None , left = None , right = None ):
3235 self .key = key
3336 self .color = color
3437 self .p = p
@@ -73,7 +76,7 @@ def rightRotate(T, x):
7376 x .p = y
7477
7578
76- def rbInsert (T , z ):
79+ def rbTreeInsert (T , z ):
7780 """
7881 红黑树的插入算法
7982 """
@@ -111,15 +114,24 @@ def rbInsertFixup(T, z):
111114 y .color = BLACK
112115 z .p .p .color = RED
113116 z = z .p .p
114- elif z == z .p .right :
115- z = z .p
116- leftRotate (T , z )
117+ else :
118+ if z == z .p .right :
119+ z = z .p
120+ leftRotate (T , z )
117121 z .p .color = BLACK
118122 z .p .p .color = RED
119123 rightRotate (T , z .p .p )
124+ elif z .p == z .p .p .right :
125+ y = z .p .p .left
126+ if y .color == RED :
127+ z .p .color = BLACK
128+ y .color = BLACK
129+ z .p .p .color = RED
130+ z = z .p .p
120131 else :
121- z = z .p
122- rightRotate (T , z )
132+ if z == z .p .left :
133+ z = z .p
134+ rightRotate (T , z )
123135 z .p .color = BLACK
124136 z .p .p .color = RED
125137 leftRotate (T , z .p .p )
@@ -215,3 +227,22 @@ def rbDeleteFixup(T, x):
215227 x = T .root
216228 x .color = BLACK
217229
230+
231+ def inOrderRBWalk (tree ):
232+ """中序遍历二叉搜索树,从小到大输出元素"""
233+ inOrderRBWalkNode (tree .root , tree .nil )
234+
235+
236+ def inOrderRBWalkNode (node , ni ):
237+ """中序遍历二叉搜索树,从小到大输出元素"""
238+ if node and node != ni :
239+ inOrderRBWalkNode (node .left , ni )
240+ print (node .key )
241+ inOrderRBWalkNode (node .right , ni )
242+
243+ if __name__ == '__main__' :
244+ ss = [4 , 23 , 65 , 22 , 12 , 3 , 7 , 1 , 256 , 34 , 27 ]
245+ tree = RBTree ()
246+ for i in ss :
247+ rbTreeInsert (tree , RBNode (i ))
248+ inOrderRBWalk (tree )
0 commit comments