Skip to content

Commit f843046

Browse files
committed
Implement Binary Search Tree with insertion, search, and traversal methods
1 parent 3c4c397 commit f843046

1 file changed

Lines changed: 224 additions & 0 deletions

File tree

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
"""
2+
Binary Search Tree Implementation
3+
Time Complexity:
4+
- Insert: O(log n) average, O(n) worst case
5+
- Search: O(log n) average, O(n) worst case
6+
- Delete: O(log n) average, O(n) worst case
7+
Space Complexity: O(n)
8+
Author: Karanjot Singh
9+
Date: October 2025
10+
Hacktoberfest 2025
11+
"""
12+
13+
class TreeNode:
14+
"""Node class for Binary Search Tree"""
15+
def __init__(self, value):
16+
self.value = value
17+
self.left = None
18+
self.right = None
19+
20+
21+
class BinarySearchTree:
22+
"""Binary Search Tree implementation with common operations"""
23+
24+
def __init__(self):
25+
self.root = None
26+
27+
def insert(self, value):
28+
"""
29+
Insert a value into the BST
30+
31+
Args:
32+
value: Value to insert
33+
"""
34+
if self.root is None:
35+
self.root = TreeNode(value)
36+
else:
37+
self._insert_recursive(self.root, value)
38+
39+
def _insert_recursive(self, node, value):
40+
"""Helper method for recursive insertion"""
41+
if value < node.value:
42+
if node.left is None:
43+
node.left = TreeNode(value)
44+
else:
45+
self._insert_recursive(node.left, value)
46+
else:
47+
if node.right is None:
48+
node.right = TreeNode(value)
49+
else:
50+
self._insert_recursive(node.right, value)
51+
52+
def search(self, value):
53+
"""
54+
Search for a value in the BST
55+
56+
Args:
57+
value: Value to search for
58+
59+
Returns:
60+
True if value exists, False otherwise
61+
"""
62+
return self._search_recursive(self.root, value)
63+
64+
def _search_recursive(self, node, value):
65+
"""Helper method for recursive search"""
66+
if node is None:
67+
return False
68+
69+
if value == node.value:
70+
return True
71+
elif value < node.value:
72+
return self._search_recursive(node.left, value)
73+
else:
74+
return self._search_recursive(node.right, value)
75+
76+
def inorder_traversal(self):
77+
"""
78+
Perform inorder traversal (Left -> Root -> Right)
79+
Returns sorted order for BST
80+
81+
Returns:
82+
List of values in inorder
83+
"""
84+
result = []
85+
self._inorder_recursive(self.root, result)
86+
return result
87+
88+
def _inorder_recursive(self, node, result):
89+
"""Helper method for inorder traversal"""
90+
if node:
91+
self._inorder_recursive(node.left, result)
92+
result.append(node.value)
93+
self._inorder_recursive(node.right, result)
94+
95+
def preorder_traversal(self):
96+
"""
97+
Perform preorder traversal (Root -> Left -> Right)
98+
99+
Returns:
100+
List of values in preorder
101+
"""
102+
result = []
103+
self._preorder_recursive(self.root, result)
104+
return result
105+
106+
def _preorder_recursive(self, node, result):
107+
"""Helper method for preorder traversal"""
108+
if node:
109+
result.append(node.value)
110+
self._preorder_recursive(node.left, result)
111+
self._preorder_recursive(node.right, result)
112+
113+
def postorder_traversal(self):
114+
"""
115+
Perform postorder traversal (Left -> Right -> Root)
116+
117+
Returns:
118+
List of values in postorder
119+
"""
120+
result = []
121+
self._postorder_recursive(self.root, result)
122+
return result
123+
124+
def _postorder_recursive(self, node, result):
125+
"""Helper method for postorder traversal"""
126+
if node:
127+
self._postorder_recursive(node.left, result)
128+
self._postorder_recursive(node.right, result)
129+
result.append(node.value)
130+
131+
def find_min(self):
132+
"""
133+
Find minimum value in BST
134+
135+
Returns:
136+
Minimum value or None if tree is empty
137+
"""
138+
if self.root is None:
139+
return None
140+
141+
current = self.root
142+
while current.left:
143+
current = current.left
144+
return current.value
145+
146+
def find_max(self):
147+
"""
148+
Find maximum value in BST
149+
150+
Returns:
151+
Maximum value or None if tree is empty
152+
"""
153+
if self.root is None:
154+
return None
155+
156+
current = self.root
157+
while current.right:
158+
current = current.right
159+
return current.value
160+
161+
def height(self):
162+
"""
163+
Calculate height of the tree
164+
165+
Returns:
166+
Height of tree (0 for single node, -1 for empty tree)
167+
"""
168+
return self._height_recursive(self.root)
169+
170+
def _height_recursive(self, node):
171+
"""Helper method to calculate height"""
172+
if node is None:
173+
return -1
174+
175+
left_height = self._height_recursive(node.left)
176+
right_height = self._height_recursive(node.right)
177+
178+
return 1 + max(left_height, right_height)
179+
180+
181+
# Test cases
182+
if __name__ == "__main__":
183+
print("=== Binary Search Tree Implementation ===\n")
184+
185+
# Create BST and insert values
186+
bst = BinarySearchTree()
187+
values = [50, 30, 70, 20, 40, 60, 80]
188+
189+
print(f"Inserting values: {values}")
190+
for val in values:
191+
bst.insert(val)
192+
193+
# Test traversals
194+
print(f"\nInorder traversal (sorted): {bst.inorder_traversal()}")
195+
print(f"Preorder traversal: {bst.preorder_traversal()}")
196+
print(f"Postorder traversal: {bst.postorder_traversal()}")
197+
198+
# Test search
199+
print("\n--- Search Operations ---")
200+
search_values = [40, 25, 80, 100]
201+
for val in search_values:
202+
found = bst.search(val)
203+
print(f"Search for {val}: {'Found' if found else 'Not found'}")
204+
205+
# Test min/max
206+
print("\n--- Min/Max Operations ---")
207+
print(f"Minimum value: {bst.find_min()}")
208+
print(f"Maximum value: {bst.find_max()}")
209+
210+
# Test height
211+
print(f"\nTree height: {bst.height()}")
212+
213+
# Test with another tree
214+
print("\n--- Another BST Example ---")
215+
bst2 = BinarySearchTree()
216+
values2 = [15, 10, 20, 8, 12, 17, 25]
217+
print(f"Inserting values: {values2}")
218+
for val in values2:
219+
bst2.insert(val)
220+
221+
print(f"Inorder traversal: {bst2.inorder_traversal()}")
222+
print(f"Tree height: {bst2.height()}")
223+
224+
print("\n✅ All test cases completed!")

0 commit comments

Comments
 (0)