@@ -51,7 +51,7 @@ def inorder(self, root):
51
51
'''
52
52
if root :
53
53
self .inorder (root .get_left ()) # traverse to leftmost child
54
- self ._inorder .append (root .get_data ()) # get the data of current node
54
+ self ._inorder .append (root .get_data ()) # get the data of current node
55
55
self .inorder (root .get_right ()) # traverse to rightmost child
56
56
return self ._inorder
57
57
@@ -61,7 +61,7 @@ def preorder(self, root):
61
61
@type: root: Node object
62
62
'''
63
63
if root :
64
- self ._preorder .append (root .get_data ()) # get the data of current node
64
+ self ._preorder .append (root .get_data ()) # get the data of current node
65
65
self .preorder (root .get_left ()) # traverse to leftmost child
66
66
self .preorder (root .get_right ()) # traverse to rightmost child
67
67
return self ._preorder
@@ -74,10 +74,189 @@ def postorder(self, root):
74
74
if root :
75
75
self .postorder (root .get_left ()) # traverse to leftmost child
76
76
self .postorder (root .get_right ()) # traverse to rightmost child
77
- self ._postorder .append (root .get_data ()) # get the data of current node
77
+ self ._postorder .append (root .get_data ()) # get the data of current node
78
78
return self ._postorder
79
79
80
80
# easily retrieve the source code of the BinaryTree class
81
81
def get_code (self ):
82
82
import inspect
83
83
return inspect .getsource (BinaryTree )
84
+
85
+ class BSTNode (object ):
86
+ def __init__ (self , data ):
87
+ self .data = data
88
+ self .leftChild = None
89
+ self .rightChild = None
90
+ self ._inorder = []
91
+ self ._preorder = []
92
+ self ._postorder = []
93
+
94
+ # for setting left node
95
+ def set_left (self , node ):
96
+ self .leftChild = node
97
+
98
+ # for setting right node
99
+ def set_right (self , node ):
100
+ self .rightChild = node
101
+
102
+ # for getting the left node
103
+ def get_left (self ):
104
+ return self .leftChild
105
+
106
+ # for getting right node
107
+ def get_right (self ):
108
+ return self .rightChild
109
+
110
+ # for setting data of a node
111
+ def set_data (self , data ):
112
+ self .data = data
113
+
114
+ # for getting data of a node
115
+ def get_data (self ):
116
+ return self .data
117
+
118
+ # easily retrieve the source code of the Node class
119
+ def get_code (self ):
120
+ import inspect
121
+ return inspect .getsource (BSTNode )
122
+
123
+ def insert (self , data ):
124
+ ''' For inserting the data in the Tree '''
125
+ if self .data == data :
126
+ return False # As BST cannot contain duplicate data
127
+
128
+ elif data < self .data :
129
+ ''' Data less than the root data is placed to the left of the root '''
130
+ if self .leftChild :
131
+ return self .leftChild .insert (data )
132
+ else :
133
+ self .leftChild = BSTNode (data )
134
+ return True
135
+
136
+ else :
137
+ ''' Data greater than the root data is placed to the right of the root '''
138
+ if self .rightChild :
139
+ return self .rightChild .insert (data )
140
+ else :
141
+ self .rightChild = BSTNode (data )
142
+ return True
143
+
144
+ def minValueBSTNode (self , BSTNode ):
145
+ current = BSTNode
146
+
147
+ # loop down to find the leftmost leaf
148
+ while (current .leftChild is not None ):
149
+ current = current .leftChild
150
+
151
+ return current
152
+
153
+ def delete (self , data ):
154
+ ''' For deleting the BSTNode '''
155
+ if self is None :
156
+ return root
157
+
158
+ # if current BSTNode's data is less than that of root BSTNode, then only search in left subtree else right subtree
159
+ if data < self .data :
160
+ self .leftChild = self .leftChild .delete (data )
161
+ elif data > self .data :
162
+ self .rightChild = self .rightChild .delete (data )
163
+ else :
164
+ # deleting BSTNode with one child
165
+ if self .leftChild is None :
166
+ temp = self .rightChild
167
+ self = None
168
+ return temp
169
+ elif self .rightChild is None :
170
+ temp = self .leftChild
171
+ self = None
172
+ return temp
173
+
174
+ # deleting BSTNode with two children
175
+ # first get the inorder successor
176
+ temp = self .minValueBSTNode (self .rightChild )
177
+ self .data = temp .data
178
+ self .rightChild = self .rightChild .delete (temp .data )
179
+
180
+ return self
181
+
182
+ def find (self , data ):
183
+ ''' This function checks whether the specified data is in tree or not '''
184
+ if (data == self .data ):
185
+ return True
186
+ elif (data < self .data ):
187
+ if self .leftChild :
188
+ return self .leftChild .find (data )
189
+ else :
190
+ return False
191
+ else :
192
+ if self .rightChild :
193
+ return self .rightChild .find (data )
194
+ else :
195
+ return False
196
+
197
+ def inorder (self , root ):
198
+ '''
199
+ @type: root: Node object
200
+ '''
201
+ if root :
202
+ self .inorder (root .get_left ()) # traverse to leftmost child
203
+ self ._inorder .append (root .get_data ()) # get the data of current node
204
+ self .inorder (root .get_right ()) # traverse to rightmost child
205
+ return self ._inorder
206
+
207
+ # in this we first print the root node and then traverse towards leftmost node and then to the rightmost node
208
+ def preorder (self , root ):
209
+ '''
210
+ @type: root: Node object
211
+ '''
212
+ if root :
213
+ self ._preorder .append (root .get_data ()) # get the data of current node
214
+ self .preorder (root .get_left ()) # traverse to leftmost child
215
+ self .preorder (root .get_right ()) # traverse to rightmost child
216
+ return self ._preorder
217
+
218
+ # in this we first traverse to the leftmost node and then to the rightmost node and then print the data
219
+ def postorder (self , root ):
220
+ '''
221
+ @type: root: Node object
222
+ '''
223
+ if root :
224
+ self .postorder (root .get_left ()) # traverse to leftmost child
225
+ self .postorder (root .get_right ()) # traverse to rightmost child
226
+ self ._postorder .append (root .get_data ()) # get the data of current node
227
+ return self ._postorder
228
+
229
+ class BinarySearchTree (object ):
230
+ def __init__ (self ):
231
+ self .root = None
232
+
233
+ def insert (self , data ):
234
+ if self .root :
235
+ return self .root .insert (data )
236
+ else :
237
+ self .root = BSTNode (data )
238
+ return True
239
+
240
+ def delete (self , data ):
241
+ if self .root is not None :
242
+ return self .root .delete (data )
243
+
244
+ def find (self , data ):
245
+ if self .root :
246
+ return self .root .find (data )
247
+ else :
248
+ return False
249
+
250
+ def preorder (self ):
251
+ if self .root is not None :
252
+ return self .root .preorder (self .root )
253
+
254
+ def inorder (self ):
255
+ print ()
256
+ if self .root is not None :
257
+ return self .root .inorder (self .root )
258
+
259
+ def postorder (self ):
260
+ print ()
261
+ if self .root is not None :
262
+ return self .root .postorder (self .root )
0 commit comments