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