Skip to content

Commit 5f56e6a

Browse files
Update
1 parent 5302c44 commit 5f56e6a

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

Chapter06/binary_search_tree.py

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
class Node:
2+
def __init__(self, data):
3+
self.data = data
4+
self.right_child = None
5+
self.left_child = None
6+
7+
class Tree:
8+
def __init__(self):
9+
self.root_node = None
10+
11+
def insert(self, data):
12+
node = Node(data)
13+
if self.root_node is None:
14+
self.root_node = node
15+
return self.root_node
16+
else:
17+
current = self.root_node
18+
parent = None
19+
while True:
20+
parent = current
21+
if node.data < parent.data:
22+
current = current.left_child
23+
if current is None:
24+
parent.left_child = node
25+
return self.root_node
26+
else:
27+
current = current.right_child
28+
if current is None:
29+
parent.right_child = node
30+
return self.root_node
31+
32+
def inorder(self, root_node):
33+
current = root_node
34+
if current is None:
35+
return
36+
self.inorder(current.left_child)
37+
print(current.data)
38+
self.inorder(current.right_child)
39+
40+
41+
def get_node_with_parent(self, data):
42+
parent = None
43+
current = self.root_node
44+
if current is None:
45+
return (parent, None)
46+
while True:
47+
if current.data == data:
48+
return (parent, current)
49+
elif current.data > data:
50+
parent = current
51+
current = current.left_child
52+
else:
53+
parent = current
54+
current = current.right_child
55+
return (parent, current)
56+
57+
58+
def remove(self, data):
59+
parent, node = self.get_node_with_parent(data)
60+
61+
if parent is None and node is None:
62+
return False
63+
64+
# Get children count
65+
children_count = 0
66+
67+
if node.left_child and node.right_child:
68+
children_count = 2
69+
elif (node.left_child is None) and (node.right_child is None):
70+
children_count = 0
71+
else:
72+
children_count = 1
73+
74+
if children_count == 0:
75+
if parent:
76+
if parent.right_child is node:
77+
parent.right_child = None
78+
else:
79+
parent.left_child = None
80+
else:
81+
self.root_node = None
82+
elif children_count == 1:
83+
next_node = None
84+
if node.left_child:
85+
next_node = node.left_child
86+
else:
87+
next_node = node.right_child
88+
89+
if parent:
90+
if parent.left_child is node:
91+
parent.left_child = next_node
92+
else:
93+
parent.right_child = next_node
94+
else:
95+
self.root_node = next_node
96+
else:
97+
parent_of_leftmost_node = node
98+
leftmost_node = node.right_child
99+
while leftmost_node.left_child:
100+
parent_of_leftmost_node = leftmost_node
101+
leftmost_node = leftmost_node.left_child
102+
node.data = leftmost_node.data
103+
104+
if parent_of_leftmost_node.left_child == leftmost_node:
105+
parent_of_leftmost_node.left_child = leftmost_node.right_child
106+
else:
107+
parent_of_leftmost_node.right_child = leftmost_node.right_child
108+
109+
110+
111+
def search(self, data):
112+
current = self.root_node
113+
while True:
114+
if current is None:
115+
print("Item not found")
116+
return None
117+
elif current.data is data:
118+
print("Item found", data)
119+
return data
120+
elif current.data > data:
121+
current = current.left_child
122+
else:
123+
current = current.right_child
124+
125+
126+
def find_min(self):
127+
current = self.root_node
128+
while current.left_child:
129+
current = current.left_child
130+
return current.data
131+
132+
133+
def find_max(self):
134+
current = self.root_node
135+
while current.right_child:
136+
current = current.right_child
137+
return current.data
138+
139+
140+
141+
tree = Tree()
142+
r = tree.insert(5)
143+
r = tree.insert(2)
144+
r = tree.insert(7)
145+
r = tree.insert(9)
146+
r = tree.insert(1)
147+
148+
tree.inorder(r)
149+
150+
151+
152+
tree.search(9)
153+
154+
155+
tree.remove(9)
156+
tree.search(9)
157+
158+
tree = Tree()
159+
tree.insert(5)
160+
tree.insert(2)
161+
tree.insert(7)
162+
tree.insert(9)
163+
tree.insert(1)
164+
165+
print(tree.find_min())
166+
print(tree.find_max())

0 commit comments

Comments
 (0)