Deletion in a Binary Tree in C++ Program

In this tutorial, we are going to learn how to delete a node in a binary tree.
The nodes in a binary tree don't follow any order like binary search trees. So, how to arrange the nodes after deleting a node in a binary tree?
Well, we will replace the deepest node of the tree with the deleting node. And then we will delete the deepest node from the node.
Let's see the steps to solve the problem.
Initialize the tree with binary node struct.
Initialize the tree with binary node struct.
Write a function (preorder, in order, and postorder) to print the nodes of the tree.
Write a function (preorder, in order, and postorder) to print the nodes of the tree.
Write a function to delete the node.Initialize a queue to iterate through the tree.Iterate until the queue is empty.Find the node with the given key and store it in a variable.And the last node from the queue is the deepest node.
Write a function to delete the node.
Initialize a queue to iterate through the tree.
Initialize a queue to iterate through the tree.
Iterate until the queue is empty.
Iterate until the queue is empty.
Find the node with the given key and store it in a variable.
Find the node with the given key and store it in a variable.
And the last node from the queue is the deepest node.
And the last node from the queue is the deepest node.
Delete the deepest node using another function.Use the queue to traverse through the tree.When we find the node delete it and return it.
Delete the deepest node using another function.
Use the queue to traverse through the tree.
Use the queue to traverse through the tree.
When we find the node delete it and return it.
When we find the node delete it and return it.
Print the tree to see if the node is deleted or not.
Print the tree to see if the node is deleted or not.
Let's see the code.
 Live Demo
#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node *left, *right;
};
struct Node* newNode(int data) {
   struct Node* temp = new Node;
   temp->data = data;
   temp->left = temp->right = NULL;
   return temp;
};
void inorder(struct Node* node) {
   if (node == NULL) {
      return;
   }
   inorder(node->left);
   cout << node->data << " ";
   inorder(node->right);
}
void deleteDeepestNode(struct Node* root, struct Node* deleting_node){
   queue<struct Node*> nodes;
   nodes.push(root);
   struct Node* temp;
   while (!nodes.empty()) {
      temp = nodes.front();
      nodes.pop();
      if (temp == deleting_node) {
         temp = NULL;
         delete (deleting_node);
         return;
      }
      if (temp->right) {
         if (temp->right == deleting_node) {
            temp->right = NULL;
            delete deleting_node;
            return;
         }
         else {
            nodes.push(temp->right);
         }
      }
      if (temp->left) {
         if (temp->left == deleting_node) {
            temp->left = NULL;
            delete deleting_node;
            return;
         }
         else {
            nodes.push(temp->left);
         }
      }
   }
}
Node* deleteNode(struct Node* root, int key) {
   if (root == NULL){
      return NULL;
   }
   if (root->left == NULL && root->right == NULL) {
      if (root->data == key) {
         return NULL;
      }
      else {
         return root;
      }
   }
   queue<struct Node*> nodes;
   nodes.push(root);
   struct Node* temp;
   struct Node* key_node = NULL;
   while (!nodes.empty()) {
      temp = nodes.front();
      nodes.pop();
      if (temp->data == key) {
         key_node = temp;
      }
      if (temp->left) {
         nodes.push(temp->left);
      }
      if (temp->right) {
         nodes.push(temp->right);
      }
   }
   if (key_node != NULL) {
      int deepest_node_data = temp->data;
      deleteDeepestNode(root, temp);
      key_node->data = deepest_node_data;
   }
   return root;
}
int main() {
   struct Node* root = newNode(1);
   root->left = newNode(2);
   root->left->left = newNode(3);
   root->left->right = newNode(4);
   root->right = newNode(5);
   root->right->left = newNode(6);
   root->right->right = newNode(7);
   root->right->left->left = newNode(8);
   root->right->left->right = newNode(9);
   cout << "Tree before deleting key: ";
   inorder(root);
   int key = 5;
   root = deleteNode(root, key);
   cout << "\nTree after deleting key: ";
   inorder(root);
   cout << endl;
   return 0;
}
If you run the above code, then you will get the following result.
Tree before deleting key: 3 2 4 1 8 6 9 5 7
Tree after deleting key: 3 2 4 1 8 6 9 7
If you have any queries in the tutorial, mention them in the comment section.