-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbst.py
127 lines (110 loc) · 3.22 KB
/
bst.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
class Tree:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def add_child(self, data):
if data == self.data:
return
elif data < self.data:
if self.left:
self.left.add_child(data)
else:
self.left = Tree(data)
else:
if self.right:
self.right.add_child(data)
else:
self.right = Tree(data)
def inorder(self):
elements = []
if self.left:
elements += self.left.inorder()
elements.append(self.data)
if self.right:
elements += self.right.inorder()
return elements
def search(self,val):
if val == self.data:
return True
if val < self.data:
if self.left:
return self.left.search(val)
else:
return False
if val > self.data:
if self.right:
return self.right.search(val)
else:
return False
def tree_max(self):
if self.right is None:
return self.data
return self.right.tree_max()
def tree_min(self):
if self.left is None:
return self.data
return self.left.tree_min()
def tree_sum(self):
s = self.data
if self.left:
s += self.left.tree_sum()
if self.right:
s += self.right.tree_sum()
return s
def postorder(self):
elements = []
if self.left:
elements += (self.left.postorder())
if self.right:
elements += (self.right.postorder())
elements.append(self.data)
return elements
def preorder(self):
elements = []
elements.append(self.data)
if self.left:
elements += self.left.preorder()
if self.right:
elements += self.right.preorder()
return elements
def delete(self,val):
if val < self.data:
if self.left:
self.left = self.left.delete(val)
elif val > self.data:
if self.right:
self.right = self.right.delete(val)
else:
if self.left is None and self.right is None:
return None
if self.left is None:
return self.right
if self.right is None:
return self.left
"""
min_val = self.right.tree_min()
self.root = min_val
self.right = self.right.delete(min_val)
"""
max_val = self.left.tree_max()
self.data = max_val
self.left.delete(max_val)
return self
def build_tree(elements):
root = Tree(elements[0])
for i in range(1, len(elements)):
root.add_child(elements[i])
return root
if __name__ == '__main__':
elements = [17,300,4,1,20,9,50,80,2,69,1,4,189]
root = build_tree(elements)
print(root.inorder())
print(root.search(69))
print(root.tree_max())
print(root.tree_min())
print(root.tree_sum())
print(root.postorder())
print(root.preorder())
(root.delete(17))
print(root.inorder())