-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBinarySearchTree.py
More file actions
182 lines (137 loc) · 3.97 KB
/
BinarySearchTree.py
File metadata and controls
182 lines (137 loc) · 3.97 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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# 19/7/18 fixed ceil bug
# 19/7/18 added size method, which returns numbers nodes in a subtree (by default set to number nodes in tree)
# 19/7/18 added rank function/ all keys < k
# 20/7/18 added inorder traversal to view nodes
# 26/7/18 refactored naming conventions
# 26/7/18 fixed delete min rec bug
# 27/7/18 Added find min function and completed delete key function // hibbard deletion
# need to keep in mind scope and return nature in recursive functions
# 27/7/18 Fixed insidious bug in find min // return bug
# 30/5/19 Fixed major bug in insert
# 6/6/19 Added put method as better alternative to insert
# 8/6/19 Overhauled many methods fixing many bugs
#binary search tree
class Node():
def __init__(self, key, value):
self.key = key
self.value = value
self.count = 0
self.left = None
self.right = None
class BST():
def __init__(self):
self.root = None
def get(self, key):
if self.root is None:
return None
else:
current = self.root
while (current != None):
if key == current.key:
print('key found')
return current.value
elif key > current.key:
current = current.right
else:
current = current.left
return None
def put(self, key, value):
self.root = self._put(self.root, key, value)
def _put(self, node, key, value):
if node is None:
node = Node (key, value)
elif key == node.key:
node.value = value
elif key > node.key:
node.right = self._put(node.right, key, value)
else:
node.left = self._put(node.left, key, value)
node.count = 1 + self._size(node.left) + self._size(node.right)
return node
def size(self):
if self.root is None:
return None
else:
print ('size of root node is: ', self.root.count)
return
def _size(self, node):
if node is None:
return 0
else:
return node.count
def floor(self, key):
resultnode = self._floor(self.root, key)
if resultnode is None:
return None
else:
print('floor key is: ', resultnode.key)
return resultnode.key
def _floor(self, node, key):
if node is None:
return None
elif node.key == key:
return node
elif node.key > key:
return self._floor(node.left, key)
else:
altnode = self._floor(node.right, key)
if altnode is None:
return node
else:
return altnode
def rank(self, key):
size = self._rank(self.root, key)
print('rank of key is: ', size )
def _rank(self, node, key):
if node is None:
return 0
elif node.key == key:
return self._size(node.left)
elif node.key > key:
return self._rank(node.left, key)
else:
return 1 + self._size(node.left) + self._rank(node.right, key)
def delete(self, key):
self.root = self._delete(self.root, key)
def _delete(self, node, key):
if node is None:
return None
elif key < node.key:
node.left = self._delete(node.left, key)
elif key > node.key:
node.right = self._delete(node.right, key)
# key found
else:
if node.left is None:
return node.right
if node.right is None:
return node.left
else:
tempnode = node
node = self.getchild(node.right)
node.left = tempnode.left
node.right = self._delete(tempnode.right, node.key)
return node
def getchild(self, node):
while node.left is not None:
node = node.left
return node
if __name__ == '__main__':
a = BST()
a.put(7,7)
a.put(3,3)
a.put(10,10)
a.put(1,1)
a.put(5,5)
a.put(8,8)
a.get(5)
a.get(10)
a.size()
a.floor(6)
a.floor(8)
a.rank(7)
a.rank(3)
a.rank(1)
a.delete(3)
a.get(3)
a.get(5)