1
+ # Binary Search Tree in Python
2
+
3
+ class Node :
4
+ def __init__ (self , val ):
5
+ self .value = val
6
+ self .leftChild = None
7
+ self .rightChild = None
8
+
9
+ def insert (self , data ):
10
+ if self .value == data :
11
+ return False
12
+
13
+ elif self .value > data :
14
+ if self .leftChild :
15
+ return self .leftChild .insert (data )
16
+ else :
17
+ self .leftChild = Node (data )
18
+ return True
19
+
20
+ else :
21
+ if self .rightChild :
22
+ return self .rightChild .insert (data )
23
+ else :
24
+ self .rightChild = Node (data )
25
+ return True
26
+
27
+ def find (self , data ):
28
+ if (self .value == data ):
29
+ return True
30
+ elif self .value > data :
31
+ if self .leftChild :
32
+ return self .leftChild .find (data )
33
+ else :
34
+ return False
35
+ else :
36
+ if self .rightChild :
37
+ return self .rightChild .find (data )
38
+ else :
39
+ return False
40
+
41
+ def getSize (self ):
42
+ if self .leftChild and self .rightChild :
43
+ return 1 + self .leftChild .getSize () + self .rightChild .getSize ()
44
+ elif self .leftChild :
45
+ return 1 + self .leftChild .getSize ()
46
+ elif self .rightChild :
47
+ return 1 + self .rightChild .getSize ()
48
+ else :
49
+ return 1
50
+
51
+ def getHeight (self ):
52
+ if self .leftChild and self .rightChild :
53
+ return 1 + max (self .leftChild .getHeight (), self .rightChild .getHeight ())
54
+ elif self .leftChild :
55
+ return 1 + self .leftChild .getHeight ()
56
+ elif self .rightChild :
57
+ return 1 + self .rightChild .getHeight ()
58
+ else :
59
+ return 1
60
+
61
+ def preorder (self ):
62
+ if self :
63
+ print (str (self .value ))
64
+ if self .leftChild :
65
+ self .leftChild .preorder ()
66
+ if self .rightChild :
67
+ self .rightChild .preorder ()
68
+
69
+ def postorder (self ):
70
+ if self :
71
+ if self .leftChild :
72
+ self .leftChild .postorder ()
73
+ if self .rightChild :
74
+ self .rightChild .postorder ()
75
+ print (str (self .value ))
76
+
77
+ def inorder (self ):
78
+ if self :
79
+ if self .leftChild :
80
+ self .leftChild .inorder ()
81
+ print (str (self .value ))
82
+ if self .rightChild :
83
+ self .rightChild .inorder ()
84
+
85
+ class Tree :
86
+ def __init__ (self ):
87
+ self .root = None
88
+
89
+ def insert (self , data ):
90
+ if self .root :
91
+ return self .root .insert (data )
92
+ else :
93
+ self .root = Node (data )
94
+ return True
95
+
96
+ def find (self , data ):
97
+ if self .root :
98
+ return self .root .find (data )
99
+ else :
100
+ return False
101
+
102
+ def getHeight (self ):
103
+ if self .root :
104
+ return self .root .getHeight ()
105
+ else :
106
+ return 0
107
+
108
+ def getSize (self ):
109
+ if self .root :
110
+ return self .root .getSize ()
111
+ else :
112
+ return 0
113
+
114
+ def remove (self , data ):
115
+ # empty tree
116
+ if self .root is None :
117
+ return False
118
+
119
+ # data is in root node
120
+ elif self .root .value == data :
121
+ if self .root .leftChild is None and self .root .rightChild is None :
122
+ self .root = None
123
+ elif self .root .leftChild and self .root .rightChild is None :
124
+ self .root = self .root .leftChild
125
+ elif self .root .leftChild is None and self .root .rightChild :
126
+ self .root = self .root .rightChild
127
+ elif self .root .leftChild and self .root .rightChild :
128
+ delNodeParent = self .root
129
+ delNode = self .root .rightChild
130
+ while delNode .leftChild :
131
+ delNodeParent = delNode
132
+ delNode = delNode .leftChild
133
+
134
+ self .root .value = delNode .value
135
+ if delNode .rightChild :
136
+ if delNodeParent .value > delNode .value :
137
+ delNodeParent .leftChild = delNode .rightChild
138
+ elif delNodeParent .value < delNode .value :
139
+ delNodeParent .rightChild = delNode .rightChild
140
+ else :
141
+ if delNode .value < delNodeParent .value :
142
+ delNodeParent .leftChild = None
143
+ else :
144
+ delNodeParent .rightChild = None
145
+
146
+ return True
147
+
148
+ parent = None
149
+ node = self .root
150
+
151
+ # find node to remove
152
+ while node and node .value != data :
153
+ parent = node
154
+ if data < node .value :
155
+ node = node .leftChild
156
+ elif data > node .value :
157
+ node = node .rightChild
158
+
159
+ # case 1: data not found
160
+ if node is None or node .value != data :
161
+ return False
162
+
163
+ # case 2: remove-node has no children
164
+ elif node .leftChild is None and node .rightChild is None :
165
+ if data < parent .value :
166
+ parent .leftChild = None
167
+ else :
168
+ parent .rightChild = None
169
+ return True
170
+
171
+ # case 3: remove-node has left child only
172
+ elif node .leftChild and node .rightChild is None :
173
+ if data < parent .value :
174
+ parent .leftChild = node .leftChild
175
+ else :
176
+ parent .rightChild = node .leftChild
177
+ return True
178
+
179
+ # case 4: remove-node has right child only
180
+ elif node .leftChild is None and node .rightChild :
181
+ if data < parent .value :
182
+ parent .leftChild = node .rightChild
183
+ else :
184
+ parent .rightChild = node .rightChild
185
+ return True
186
+
187
+ # case 5: remove-node has left and right children
188
+ else :
189
+ delNodeParent = node
190
+ delNode = node .rightChild
191
+ while delNode .leftChild :
192
+ delNodeParent = delNode
193
+ delNode = delNode .leftChild
194
+
195
+ node .value = delNode .value
196
+ if delNode .rightChild :
197
+ if delNodeParent .value > delNode .value :
198
+ delNodeParent .leftChild = delNode .rightChild
199
+ elif delNodeParent .value < delNode .value :
200
+ delNodeParent .rightChild = delNode .rightChild
201
+ else :
202
+ if delNode .value < delNodeParent .value :
203
+ delNodeParent .leftChild = None
204
+ else :
205
+ delNodeParent .rightChild = None
206
+
207
+ def preorder (self ):
208
+ if self .root is not None :
209
+ print ("PreOrder" )
210
+ self .root .preorder ()
211
+
212
+ def postorder (self ):
213
+ if self .root is not None :
214
+ print ("PostOrder" )
215
+ self .root .postorder ()
216
+
217
+ def inorder (self ):
218
+ if self .root is not None :
219
+ print ("InOrder" )
220
+ self .root .inorder ()
221
+
222
+ def main ():
223
+ bst = Tree ()
224
+ print (bst .insert (10 ))
225
+ print (bst .insert (5 ))
226
+ bst .insert (2 )
227
+ bst .insert (7 )
228
+ bst .preorder ()
229
+ print ('Height = ' , bst .getHeight ())
230
+ print ('Size = ' , bst .getSize ())
231
+ #bst.postorder()
232
+ #bst.inorder()
233
+ print (bst .remove (10 ))
234
+ bst .preorder ()
235
+
236
+ main ()
0 commit comments