@@ -78,37 +78,120 @@ def find(self, data):
78
78
return self .root .find (data )
79
79
else :
80
80
return False
81
+
82
+ def remove (self , data ):
83
+ # empty tree
84
+ if self .root is None :
85
+ return False
81
86
87
+ # data is in root node
88
+ elif self .root .value == data :
89
+ if self .root .leftChild is None and self .root .rightChild is None :
90
+ self .root = None
91
+ elif self .root .leftChild and self .root .rightChild is None :
92
+ self .root = self .root .leftChild
93
+ elif self .root .leftChild is None and self .root .rightChild :
94
+ self .root = self .root .rightChild
95
+ elif self .root .leftChild and self .root .rightChild :
96
+ delNodeParent = self .root
97
+ delNode = self .root .rightChild
98
+ while delNode .leftChild :
99
+ delNodeParent = delNode
100
+ delNode = delNode .leftChild
101
+
102
+ self .root .value = delNode .value
103
+ if delNode .rightChild :
104
+ if delNodeParent .value > delNode .value :
105
+ delNodeParent .leftChild = delNode .rightChild
106
+ elif delNodeParent .value < delNode .value :
107
+ delNodeParent .rightChild = delNode .rightChild
108
+ else :
109
+ if delNode .value < delNodeParent .value :
110
+ delNodeParent .leftChild = None
111
+ else :
112
+ delNodeParent .rightChild = None
113
+
114
+ return True
115
+
116
+ parent = None
117
+ node = self .root
118
+
119
+ # find node to remove
120
+ while node and node .value != data :
121
+ parent = node
122
+ if data < node .value :
123
+ node = node .leftChild
124
+ elif data > node .value :
125
+ node = node .rightChild
126
+
127
+ # case 1: data not found
128
+ if node is None or node .value != data :
129
+ return False
130
+
131
+ # case 2: remove-node has no children
132
+ elif node .leftChild is None and node .rightChild is None :
133
+ if data < parent .value :
134
+ parent .leftChild = None
135
+ else :
136
+ parent .rightChild = None
137
+ return True
138
+
139
+ # case 3: remove-node has left child only
140
+ elif node .leftChild and node .rightChild is None :
141
+ if data < parent .value :
142
+ parent .leftChild = node .leftChild
143
+ else :
144
+ parent .rightChild = node .leftChild
145
+ return True
146
+
147
+ # case 4: remove-node has right child only
148
+ elif node .leftChild is None and node .rightChild :
149
+ if data < parent .value :
150
+ parent .leftChild = node .rightChild
151
+ else :
152
+ parent .rightChild = node .rightChild
153
+ return True
154
+
155
+ # case 5: remove-node has left and right children
156
+ else :
157
+ delNodeParent = node
158
+ delNode = node .rightChild
159
+ while delNode .leftChild :
160
+ delNodeParent = delNode
161
+ delNode = delNode .leftChild
162
+
163
+ node .value = delNode .value
164
+ if delNode .rightChild :
165
+ if delNodeParent .value > delNode .value :
166
+ delNodeParent .leftChild = delNode .rightChild
167
+ elif delNodeParent .value < delNode .value :
168
+ delNodeParent .rightChild = delNode .rightChild
169
+ else :
170
+ if delNode .value < delNodeParent .value :
171
+ delNodeParent .leftChild = None
172
+ else :
173
+ delNodeParent .rightChild = None
174
+
82
175
def preorder (self ):
83
- print ("PreOrder" )
84
- self .root .preorder ()
176
+ if self .root is not None :
177
+ print ("PreOrder" )
178
+ self .root .preorder ()
85
179
86
180
def postorder (self ):
87
- print ("PostOrder" )
88
- self .root .postorder ()
181
+ if self .root is not None :
182
+ print ("PostOrder" )
183
+ self .root .postorder ()
89
184
90
185
def inorder (self ):
91
- print ("InOrder" )
92
- self .root .inorder ()
186
+ if self .root is not None :
187
+ print ("InOrder" )
188
+ self .root .inorder ()
93
189
94
190
bst = Tree ()
95
191
print (bst .insert (10 ))
96
- bst .insert (5 )
97
- bst .insert (15 )
98
- bst .insert (11 )
99
- bst .preorder ()
100
- bst .postorder ()
101
- bst .inorder ()
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
192
193
+ bst .preorder ()
194
+ #bst.postorder()
195
+ #bst.inorder()
196
+ print (bst .remove (10 ))
197
+ bst .preorder ()
0 commit comments