-
Notifications
You must be signed in to change notification settings - Fork 422
/
Copy pathBinarySearchTree.py
145 lines (102 loc) · 3.33 KB
/
BinarySearchTree.py
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
"""
包括生成树,二叉搜索树的前后中遍历。
二叉搜索树在比较优质的情况下搜索和插入时间都是 O(logn) 的。在极端情况下会退化为链表 O(n)。
将无序的链表塞进二叉搜索树里,按左根右中序遍历出来就是排序好的有序链表。
"""
# 生成树操作。
class TreeNode(object):
def __init__(self , val, left=None, right=None):
self.val = val
self.left = left
self.right = right
class binarySearchTree(object):
"""
二叉搜索树,
它的性质是左边节点都小于根节点,右边的都大于根节点。
而且一般来说它是不存在重复元素的。
"""
def __init__(self, root):
if isinstance(root, TreeNode):
print(1)
self.root = root
else:
self.root = TreeNode(root)
def add(self, value):
# 从顶点开始遍历,找寻其合适的位置。
root = self.root
while 1:
if root.val < value:
if root.right is None:
if self.search(value):
break
root.right = TreeNode(value)
break
else:
root = root.right
continue
if root.val > value:
if root.left is None:
if self.search(value):
break
root.left = TreeNode(value)
break
else:
root = root.left
continue
if root.val == value:
break
def search(self, value):
# 查找一个值是否存在于这颗树中。
return self._search(self.root, value)
def _search(self, root, value):
if root.val == value:
return True
if root.right:
if root.val < value:
return self._search(root.right, value)
if root.left:
if root.val > value:
return self._search(root.left, value)
return False
def delete(self):
pass
def prevPrint(self):
# 根左右
nodes = [self.root]
result = []
while 1:
if not nodes:
return result
node = nodes.pop()
result.append(node.val)
if node.right:
nodes.append(node.right)
if node.left:
nodes.append(node.left)
def _middlePrint(self, root, result):
if root.left:
self._middlePrint(root.left, result)
result.append(root.val)
if root.right:
self._middlePrint(root.right,result)
def middlePrint(self):
# 左根右
result = []
self._middlePrint(self.root, result)
return result
def _suffPrint(self, root, result):
if root.left:
self._suffPrint(root.left, result)
if root.right:
self._suffPrint(root.right,result)
result.append(root.val)
def suffPrint(self):
# 左右根
result = []
self._suffPrint(self.root, result)
return result
oneTree = binarySearchTree(5)
for i in range(-5, 10):
oneTree.add(i)
print(oneTree.middlePrint())
print(oneTree.suffPrint())