1
- import sys
2
-
3
1
class Node :
4
2
"""Class for node of a tree"""
3
+
5
4
def __init__ (self , info ):
6
5
"""Initialising a node"""
7
6
self .info = info
@@ -18,6 +17,7 @@ def __del__(self):
18
17
19
18
class BinarySearchTree :
20
19
"""Class for BST"""
20
+
21
21
def __init__ (self ):
22
22
"""Initialising a BST"""
23
23
self .root = None
@@ -46,7 +46,7 @@ def insert(self, val):
46
46
else :
47
47
break
48
48
49
- def search (self , val , to_delete = False ):
49
+ def search (self , val , to_delete = False ):
50
50
current = self .root
51
51
prev = - 1
52
52
while current :
@@ -58,12 +58,12 @@ def search(self, val, to_delete = False):
58
58
current = current .right
59
59
elif current .info == val :
60
60
if not to_delete :
61
- return ' Match Found'
61
+ return " Match Found"
62
62
return prev
63
63
else :
64
64
break
65
65
if not to_delete :
66
- return ' Not Found'
66
+ return " Not Found"
67
67
68
68
# Method to delete a tree-node if it exists, else error message will be returned.
69
69
def delete (self , val ):
@@ -83,21 +83,21 @@ def delete(self, val):
83
83
else :
84
84
prev2 .right = None
85
85
self .root .info = temp .info
86
- print (' Deleted Root ' , val )
86
+ print (" Deleted Root " , val )
87
87
# Check if node is to left of its parent
88
88
elif prev .left and prev .left .info == val :
89
89
# Check if node is leaf node
90
90
if prev .left .left is prev .left .right :
91
91
prev .left = None
92
- print (' Deleted Node ' , val )
92
+ print (" Deleted Node " , val )
93
93
# Check if node has child at left and None at right
94
94
elif prev .left .left and prev .left .right is None :
95
95
prev .left = prev .left .left
96
- print (' Deleted Node ' , val )
96
+ print (" Deleted Node " , val )
97
97
# Check if node has child at right and None at left
98
98
elif prev .left .left is None and prev .left .right :
99
99
prev .left = prev .left .right
100
- print (' Deleted Node ' , val )
100
+ print (" Deleted Node " , val )
101
101
# Here node to be deleted has 2 children
102
102
elif prev .left .left and prev .left .right :
103
103
temp = prev .left
@@ -106,10 +106,9 @@ def delete(self, val):
106
106
temp = temp .right
107
107
prev2 .right = None
108
108
prev .left .info = temp .info
109
- print (' Deleted Node ' , val )
109
+ print (" Deleted Node " , val )
110
110
else :
111
- print ('Error Left' )
112
-
111
+ print ("Error Left" )
113
112
114
113
# Check if node is to right of its parent
115
114
elif prev .right .info == val :
@@ -118,31 +117,32 @@ def delete(self, val):
118
117
if prev .right .left is prev .right .right :
119
118
prev .right = None
120
119
flag = 1
121
- print (' Deleted Node ' , val )
120
+ print (" Deleted Node " , val )
122
121
# Check if node has left child at None at right
123
122
if prev .right and prev .right .left and prev .right .right is None :
124
123
prev .right = prev .right .left
125
- print (' Deleted Node ' , val )
124
+ print (" Deleted Node " , val )
126
125
# Check if node has right child at None at left
127
126
elif prev .right and prev .right .left is None and prev .right .right :
128
127
prev .right = prev .right .right
129
- print (' Deleted Node ' , val )
128
+ print (" Deleted Node " , val )
130
129
elif prev .right and prev .right .left and prev .right .right :
131
130
temp = prev .right
132
131
while temp .left is not None :
133
132
prev2 = temp
134
133
temp = temp .left
135
134
prev2 .left = None
136
135
prev .right .info = temp .info
137
- print (' Deleted Node ' , val )
136
+ print (" Deleted Node " , val )
138
137
else :
139
138
if flag == 0 :
140
139
print ("Error" )
141
140
else :
142
141
print ("Node doesn't exists" )
143
142
144
143
def __str__ (self ):
145
- return 'Not able to print tree yet'
144
+ return "Not able to print tree yet"
145
+
146
146
147
147
def is_bst (node , lower_lim = None , upper_lim = None ):
148
148
"""Function to find is a binary tree is a binary search tree."""
@@ -158,6 +158,7 @@ def is_bst(node, lower_lim=None, upper_lim=None):
158
158
is_right_bst = is_bst (node .right , node .info , upper_lim )
159
159
return is_left_bst and is_right_bst
160
160
161
+
161
162
def postorder (node ):
162
163
# L R N : Left , Right, Node
163
164
if node is None :
@@ -179,6 +180,7 @@ def inorder(node):
179
180
if node .right :
180
181
inorder (node .right )
181
182
183
+
182
184
def preorder (node ):
183
185
# N L R : Node , Left, Right
184
186
if node is None :
@@ -189,6 +191,7 @@ def preorder(node):
189
191
if node .right :
190
192
preorder (node .right )
191
193
194
+
192
195
# Levelwise
193
196
def bfs (node ):
194
197
queue = []
@@ -202,6 +205,7 @@ def bfs(node):
202
205
if temp .right :
203
206
queue .append (temp .right )
204
207
208
+
205
209
def preorder_itr (node ):
206
210
# N L R : Node, Left , Right
207
211
stack = [node ]
@@ -216,29 +220,31 @@ def preorder_itr(node):
216
220
stack .append (temp .left )
217
221
return values
218
222
223
+
219
224
def inorder_itr (node ):
220
225
# L N R : Left, Node, Right
221
226
# 1) Create an empty stack S.
222
227
# 2) Initialize current node as root
223
228
# 3) Push the current node to S and set current = current->left until current is NULL
224
- # 4) If current is NULL and stack is not empty then
229
+ # 4) If current is NULL and stack is not empty then
225
230
# a) Pop the top item from stack.
226
- # b) Print the popped item, set current = popped_item->right
231
+ # b) Print the popped item, set current = popped_item->right
227
232
# c) Go to step 3.
228
233
# 5) If current is NULL and stack is empty then we are done.
229
234
stack = []
230
235
current = node
231
236
while True :
232
237
if current != None :
233
- stack .append (current ) # L
238
+ stack .append (current ) # L
234
239
current = current .left
235
240
elif stack != []:
236
241
temp = stack .pop ()
237
- print (temp .info ) # N
238
- current = temp .right # R
242
+ print (temp .info ) # N
243
+ current = temp .right # R
239
244
else :
240
245
break
241
246
247
+
242
248
def postorder_itr (node ):
243
249
# L R N
244
250
# 1. Push root to first stack.
@@ -256,6 +262,7 @@ def postorder_itr(node):
256
262
s1 .append (temp .right )
257
263
print (* (s2 [::- 1 ]))
258
264
265
+
259
266
def bst_frm_pre (pre_list ):
260
267
box = Node (pre_list [0 ])
261
268
if len (pre_list ) > 1 :
@@ -272,11 +279,12 @@ def bst_frm_pre(pre_list):
272
279
else :
273
280
all_less = True
274
281
if i != 1 :
275
- box .left = bst_frm_pre (pre_list [1 : i ])
282
+ box .left = bst_frm_pre (pre_list [1 : i ])
276
283
if not all_less :
277
284
box .right = bst_frm_pre (pre_list [i :])
278
285
return box
279
286
287
+
280
288
# Function to find the lowest common ancestor of nodes with values c1 and c2.
281
289
# It return value in the lowest common ancestor, -1 indicates value returned for None.
282
290
# Note that both values v1 and v2 should be present in the bst.
@@ -293,9 +301,10 @@ def lca(t_node, c1, c2):
293
301
return current .info
294
302
return - 1
295
303
304
+
296
305
# Function to print element vertically which lie just below the root node
297
306
def vertical_middle_level (t_node ):
298
- e = (t_node , 0 ) # 0 indicates level 0, to left we have -ve and to right +ve
307
+ e = (t_node , 0 ) # 0 indicates level 0, to left we have -ve and to right +ve
299
308
queue = [e ]
300
309
ans = []
301
310
# Do a level-order traversal and assign level-value to each node
@@ -307,7 +316,8 @@ def vertical_middle_level(t_node):
307
316
queue .append ((temp .left , level - 1 ))
308
317
if temp .right :
309
318
queue .append ((temp .right , level + 1 ))
310
- return ' ' .join (ans )
319
+ return " " .join (ans )
320
+
311
321
312
322
def get_level (n , val ):
313
323
c_level = 0
@@ -319,10 +329,11 @@ def get_level(n, val):
319
329
n = n .right
320
330
c_level += 1
321
331
if n is None :
322
- return - 1
332
+ return - 1
323
333
324
334
return c_level
325
335
336
+
326
337
def depth (node ):
327
338
if node is None :
328
339
return 0
0 commit comments