Skip to content

Commit 798f5fe

Browse files
authored
Merge pull request ephremdeme#281 from Harshalszz/master
Added BinarySearchTree.py
2 parents 5a7a134 + aba238f commit 798f5fe

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed

tree/BinarySearchTree.py

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
class BSTNode:
2+
def __init__(self, key):
3+
self.key = key
4+
self.left = None
5+
self.right = None
6+
self.parent = None
7+
8+
def insert(self, node):
9+
if self.key > node.key:
10+
if self.left is None:
11+
self.left = node
12+
node.parent = self
13+
else:
14+
self.left.insert(node)
15+
elif self.key < node.key:
16+
if self.right is None:
17+
self.right = node
18+
node.parent = self
19+
else:
20+
self.right.insert(node)
21+
22+
def inorder(self):
23+
if self.left is not None:
24+
self.left.inorder()
25+
print(self.key, end=' ')
26+
if self.right is not None:
27+
self.right.inorder()
28+
29+
def replace_node_of_parent(self, new_node):
30+
if self.parent is not None:
31+
if new_node is not None:
32+
new_node.parent = self.parent
33+
if self.parent.left == self:
34+
self.parent.left = new_node
35+
elif self.parent.right == self:
36+
self.parent.right = new_node
37+
else:
38+
self.key = new_node.key
39+
self.left = new_node.left
40+
self.right = new_node.right
41+
if new_node.left is not None:
42+
new_node.left.parent = self
43+
if new_node.right is not None:
44+
new_node.right.parent = self
45+
46+
def find_min(self):
47+
current = self
48+
while current.left is not None:
49+
current = current.left
50+
return current
51+
52+
def remove(self):
53+
if (self.left is not None and self.right is not None):
54+
successor = self.right.find_min()
55+
self.key = successor.key
56+
successor.remove()
57+
elif self.left is not None:
58+
self.replace_node_of_parent(self.left)
59+
elif self.right is not None:
60+
self.replace_node_of_parent(self.right)
61+
else:
62+
self.replace_node_of_parent(None)
63+
64+
def search(self, key):
65+
if self.key > key:
66+
if self.left is not None:
67+
return self.left.search(key)
68+
else:
69+
return None
70+
elif self.key < key:
71+
if self.right is not None:
72+
return self.right.search(key)
73+
else:
74+
return None
75+
return self
76+
77+
78+
class BSTree:
79+
def __init__(self):
80+
self.root = None
81+
82+
def inorder(self):
83+
if self.root is not None:
84+
self.root.inorder()
85+
86+
def add(self, key):
87+
new_node = BSTNode(key)
88+
if self.root is None:
89+
self.root = new_node
90+
else:
91+
self.root.insert(new_node)
92+
93+
def remove(self, key):
94+
to_remove = self.search(key)
95+
if (self.root == to_remove
96+
and self.root.left is None and self.root.right is None):
97+
self.root = None
98+
else:
99+
to_remove.remove()
100+
101+
def search(self, key):
102+
if self.root is not None:
103+
return self.root.search(key)
104+
105+
106+
bstree = BSTree()
107+
108+
print('Menu (this assumes no duplicate keys)')
109+
print('add <key>')
110+
print('remove <key>')
111+
print('inorder')
112+
print('quit')
113+
114+
while True:
115+
do = input('What would you like to do? ').split()
116+
117+
operation = do[0].strip().lower()
118+
if operation == 'add':
119+
key = int(do[1])
120+
bstree.add(key)
121+
elif operation == 'remove':
122+
key = int(do[1])
123+
bstree.remove(key)
124+
elif operation == 'inorder':
125+
print('Inorder traversal: ', end='')
126+
bstree.inorder()
127+
print()
128+
elif operation == 'quit':
129+
break

0 commit comments

Comments
 (0)