Skip to content

Commit a53c22d

Browse files
committed
增加红黑树算法
1 parent 1ce4d9b commit a53c22d

2 files changed

Lines changed: 56 additions & 16 deletions

File tree

ch03_datastruct/at301_bisearchtree.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
class Tree():
13-
def __init__(self, root):
13+
def __init__(self, root=None):
1414
self.root = root
1515

1616

@@ -26,11 +26,15 @@ def __init__(self, key, p=None, left=None, right=None):
2626

2727
def inOrderWalk(tree):
2828
"""中序遍历二叉搜索树,从小到大输出元素"""
29-
root = tree.root
30-
if root:
31-
inOrderWalk(root.left)
32-
print root.key
33-
inOrderWalk(root.right)
29+
inOrderWalkNode(tree.root)
30+
31+
32+
def inOrderWalkNode(node):
33+
"""中序遍历二叉搜索树,从小到大输出元素"""
34+
if node:
35+
inOrderWalkNode(node.left)
36+
print(node.key)
37+
inOrderWalkNode(node.right)
3438

3539

3640
def treeSearch(tree, x):
@@ -145,5 +149,10 @@ def transplant(T, u, v):
145149
v.p = u.p
146150

147151

148-
152+
if __name__ == '__main__':
153+
ss = [4, 23, 65, 22, 12, 3, 7, 1, 256, 34, 27]
154+
tree = Tree()
155+
for i in ss:
156+
treeInsert(tree, Node(i))
157+
inOrderWalk(tree)
149158

ch03_datastruct/at302_redblacktree.py

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,26 @@
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

1920
class 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

2831
class 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

Comments
 (0)