Skip to content

Commit 7a2ca08

Browse files
committed
added remove function to Python BST
1 parent eb325e8 commit 7a2ca08

File tree

1 file changed

+107
-24
lines changed

1 file changed

+107
-24
lines changed

BinarySearchTree.py

+107-24
Original file line numberDiff line numberDiff line change
@@ -78,37 +78,120 @@ def find(self, data):
7878
return self.root.find(data)
7979
else:
8080
return False
81+
82+
def remove(self, data):
83+
# empty tree
84+
if self.root is None:
85+
return False
8186

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+
82175
def preorder(self):
83-
print("PreOrder")
84-
self.root.preorder()
176+
if self.root is not None:
177+
print("PreOrder")
178+
self.root.preorder()
85179

86180
def postorder(self):
87-
print("PostOrder")
88-
self.root.postorder()
181+
if self.root is not None:
182+
print("PostOrder")
183+
self.root.postorder()
89184

90185
def inorder(self):
91-
print("InOrder")
92-
self.root.inorder()
186+
if self.root is not None:
187+
print("InOrder")
188+
self.root.inorder()
93189

94190
bst = Tree()
95191
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-
114192

193+
bst.preorder()
194+
#bst.postorder()
195+
#bst.inorder()
196+
print(bst.remove(10))
197+
bst.preorder()

0 commit comments

Comments
 (0)