Reputation: 65
I've been trying to implement Deletion in a Binary Tree. I know that the three steps are:
I had to traverse the entire tree to find the deepest node. In order to delete that node, I need to find its parent. Is there any other way to find its parent without having to traverse the entire tree the second time?
This is my code.
tnode* searchNode(Tree &T, int data) {
tnode* temp = nullptr;
Queue Q;
if(!T.root)
return nullptr;
enqueue(Q, T.root);
while(!isEmptyQueue(Q)) {
temp = dequeue(Q);
if(temp->data == data) {
return temp;
}
if(temp->left) {
enqueue(Q, temp->left);
}
if(temp->right) {
enqueue(Q, temp->right);
}
}
return nullptr;
}
tnode* findDeepestNode(Tree &T) {
tnode *temp = nullptr;
Queue Q;
if(!T.root)
return nullptr;
enqueue(Q, T.root);
while(!isEmptyQueue(Q)) {
temp = dequeue(Q);
if(temp->left)
enqueue(Q, temp->left);
if(temp->right)
enqueue(Q, temp->right);
}
return temp;
}
void removeNode(Tree &T, tnode *search) {
tnode *temp = nullptr;
tnode *del = nullptr;
Queue Q;
if(!T.root || T.root == search)
return;
enqueue(Q, T.root);
while (!isEmptyQueue(Q)) {
temp = dequeue(Q);
if(temp->left) {
if(temp->left == search) {
del = temp->left;
temp->left = nullptr;
delete del;
return;
}
else
enqueue(Q, temp->left);
}
if(temp->right) {
if(temp->right == search) {
del = temp->right;
temp->right = nullptr;
delete del;
return;
}
else
enqueue(Q, temp->right);
}
}
return;
}
void deleteNode(Tree &T, int data) {
tnode *search = searchNode(T, data);
tnode *deepestnode = findDeepestNode(T);
if(search) {
search->data = deepestnode->data;
removeNode(T, deepestnode);
}
}
I've just started learning Data Structures. The code I wrote seems way too long. How can I shorten this code? Also please correct me if I'm following any bad coding practices.
Upvotes: 0
Views: 332
Reputation: 500
In this function only, you can find the deepest node as well as parent node too by passing a double pointer to the deepest node and it's parent:
tnode* searchNode(Tree &T, int data, tnode** deepest, tnode **parent) {
tnode* temp = nullptr;
tnode* searchNode = nullptr;
Queue Q,parentQ;
if(!T.root)
return nullptr;
enqueue(Q, T.root);
enqueue(parentQ, nullptr);
while(!isEmptyQueue(Q)) {
temp = dequeue(Q);
*parent = dequeue(parentQ);
if(temp->data == data) {
searchNode = temp;
}
if(temp->left) {
enqueue(Q, temp->left);
enqueue(parentQ, temp);
}
if(temp->right) {
enqueue(Q, temp->right);
enqueue(parentQ, temp);
}
}
*deepest = temp;
return searchNode;
}
Modify the deleteNode()
function as:
void deleteNode(Tree &T, int data) {
tnode *deepestnode,*parent;
tnode *search = searchNode(T, data, &deepestnode, &parent);
if(search) {
search->data = deepestnode->data;
removeNode(T, deepestnode);
}
}
This way, you can get the parent node in a single traversal and now you can modify your remove function accordingly.
Upvotes: 0