Skip to content

Commit 7f6faad

Browse files
committed
bst added.
1 parent a9b4232 commit 7f6faad

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
class Node:
2+
def __init__(self, key, value):
3+
self.key = key
4+
self.value = value
5+
self.left = None
6+
self.right = None
7+
8+
class _BinarySearchTreeInterator:
9+
def __init__ (self, root, size):
10+
self._theKeys = [None] * size
11+
self._curItem = 0
12+
self._bstTraversal(root)
13+
self._curItem = 0
14+
15+
def __iter__(self):
16+
return self
17+
18+
def __next__(self):
19+
if self._curItem < len(self._theKeys):
20+
key = self._theKeys[self._curItem]
21+
self._curItem += 1
22+
return key
23+
else:
24+
raise StopIteration
25+
26+
def _bstTraversal(self, subtree):
27+
"""
28+
Performs an inorder traversal used to build the array of keys.
29+
"""
30+
if subtree is not None:
31+
self._bstTraversal(subtree.left)
32+
self._theKeys[self._curItem] = subtree.key
33+
self._curItem += 1
34+
self._bstTraversal(subtree.right)
35+
36+
37+
class BinarySearchTree:
38+
"""
39+
Binary Search Tree Implementation
40+
"""
41+
def __init__(self):
42+
self._root = None
43+
self._size = 0
44+
45+
def __len__(self):
46+
return self._size
47+
48+
def __iter__(self):
49+
return _BinarySearchTreeInterator(self._root, self._size)
50+
51+
def __contains__(self, key):
52+
return self._bstSearch(self._root, key) is not None
53+
54+
def valueOf(self, key):
55+
node = self._bstSearch(self._root, key)
56+
assert node is not None, "Invalid map key."
57+
return node.value
58+
59+
def _bstSearch(self, subtree, target):
60+
if subtree is None: # base case
61+
return None
62+
if subtree.key == target:
63+
return subtree
64+
elif subtree.key > target: # search in left subtree
65+
return self._bstSearch(subtree.left, target)
66+
return self._bstSearch(subtree.right, target) # search in right subtree
67+
68+
def _bstMinimum(self, subtree):
69+
if subtree is None:
70+
return None
71+
elif subtree.left is None:
72+
return subtree
73+
return self._bstMinimum(subtree.left)
74+
75+
def _bstMaximum(self, subtree):
76+
if subtree is None:
77+
return None
78+
elif subtree.right is None:
79+
return subtree
80+
return self._bstMinimum(subtree.right)
81+
82+
def add(self, key, value):
83+
node = self._bstSearch(self._root, key) # if key already exists, update the value
84+
if node:
85+
node.value = value
86+
else:
87+
self._root = self._bstInsert(self._root, key, value) # else create a new node in bst
88+
self._size += 1
89+
return True
90+
91+
def _bstInsert(self, subtree, key, value):
92+
if subtree is None:
93+
subtree = Node(key, value)
94+
return subtree
95+
if key < subtree.key:
96+
subtree.left = self._bstInsert(subtree.left, key, value)
97+
else:
98+
subtree.right = self._bstInsert(subtree.right, key, value)
99+
return subtree
100+
101+
def remove(self, key):
102+
assert key in self, "Invalid Map key."
103+
self._root = self._bstRemove(self._root, key)
104+
self._size -= 1
105+
106+
def _bstRemove(self, subtree, target):
107+
if subtree is None:
108+
return subtree
109+
if target < subtree.key:
110+
subtree.left = self._bstRemove(subtree.left, target)
111+
return subtree
112+
elif target > subtree.key:
113+
subtree.right = self._bstRemove(subtree.right, target)
114+
return subtree
115+
else:
116+
if subtree.left is None and subtree.right is None: # for leaf nodes. Just delete the link
117+
return None
118+
elif subtree.left is None or subtree.right is None:
119+
if subtree.left:
120+
return subtree.left
121+
return subtree.right
122+
else:
123+
# for nodes having both children, replace node with min in right subtree and delete the value in right subtree
124+
successor = self._bstMinimum(subtree.right)
125+
subtree.key = successor.key
126+
subtree.value = successor.value
127+
subtree.right = self._bstRemove(subtree.right, successor.key)
128+
return subtree
129+
130+
131+
132+
bst = BinarySearchTree()
133+
bst.add(7, 10)
134+
bst.add(5, 12)
135+
bst.add(1, 14)
136+
bst.add(2, 16)
137+
bst.add(9, 17)
138+
bst.add(10, 13)
139+
bst.add(8, 13)
140+
141+
# for key in bst:
142+
# print(key, bst.valueOf(key))
143+
144+
bst.remove(9)
145+
146+
for key in bst:
147+
print(key, bst.valueOf(key))

0 commit comments

Comments
 (0)