forked from yidao620c/core-algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathat301_bisearch_tree.py
More file actions
164 lines (133 loc) · 3.77 KB
/
at301_bisearch_tree.py
File metadata and controls
164 lines (133 loc) · 3.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# 二叉搜索树
"""
Topic: sample
Desc : 二叉搜索树
二叉搜索树是指:对每个节点,其左子树元素不大于它,右子树元素不小于它
"""
__author__ = 'Xiong Neng'
class Tree():
def __init__(self, root=None):
self.root = root
class Node():
"""节点元素定义"""
def __init__(self, key, p=None, left=None, right=None):
self.key = key
self.p = p
self.left = left
self.right = right
def inOrderWalk(tree):
"""中序遍历二叉搜索树,从小到大输出元素"""
inOrderWalkNode(tree.root)
print('')
def inOrderWalkNode(node):
"""中序遍历二叉搜索树,从小到大输出元素"""
if node:
inOrderWalkNode(node.left)
print(node.key),
inOrderWalkNode(node.right)
def treeSearch(tree, x):
"""二叉树搜索,递归版本"""
root = tree.root
if not root or x == root.key:
return root
if x < root.key:
return treeSearch(root.left, x)
else:
return treeSearch(root.right, x)
def treeSearch2(tree, x):
""""二叉树搜索,迭代版本"""
root = tree.root
while root and x != root.key:
if x < root.key:
root = root.left
else:
root = root.right
return root
def treeMinimum(node):
while node.left:
node = node.left
return node
def treeMaximum(node):
while node.right:
node = node.right
return node
def nextNode(node):
"""查找后继节点"""
if node.right:
return treeMinimum(node.right)
p = node.p
while p and node == p.right:
node = p
p = node.p
return p
def preNode(node):
"""查找前驱节点"""
if node.left:
return treeMaximum(node.left)
p = node.p
while p and node == p.left:
node = p
p = node.p
return p
def treeInsert(tree, node):
"""二叉搜索树的插入算法"""
y = None
root = tree.root
while root:
y = root
if node.key < root.key:
root = root.left
else:
root = root.right
node.p = y
if y is None: # empty tree
tree.root = node
elif node.key < y.key:
y.left = node
else:
y.right = node
def treeDelete(T, z):
"""
二叉搜索树的删除算法
算法思想:
1,如果z没有孩子节点,简单简单的将其删除,并修改它的父节点,用None作为孩子来替换
2,如果z只有一个孩子,那么将这个孩子提升到树中z的位置,并修改z的父节点,用z的孩子替换z
3,如果z有两个孩子,那么寻找z的后继节点y(一定在z的右子树中),找到后:
i:如果y是z的右孩子,那么用y替换z,并仅留下y的右孩子。(y肯定没有左孩子)
ii:否则,先用y的右孩子替换,然后再用y替换z
"""
if z.left is None:
transplant(T, z, z.right)
elif z.right is None:
transplant(T, z, z.left)
else:
y = treeMinimum(z.right)
if y.p != z:
transplant(T, y, y.right)
y.right = z.right
y.right.p = y
transplant(T, z, y)
y.left = z.left
y.left.p = y
def transplant(T, u, v):
"""子树替换:在树T中用根节点节点为v的子树替换根节点为u的子树"""
if u.p is None:
T.root = v
elif u == u.p.left:
u.p.left = v
else:
u.p.right = v
if v:
v.p = u.p
if __name__ == '__main__':
ss = [4, 23, 65, 22, 12, 3, 7, 1, 256, 34, 27]
tree = Tree()
for i in ss:
treeInsert(tree, Node(i))
n = Node(26)
treeInsert(tree, n)
inOrderWalk(tree)
treeDelete(tree, n)
inOrderWalk(tree)