Postorder successor of a Node in Binary Tree in C++


In this problem, we are given a binary tree and node. Our task is to print the postorder successor of the node in Binary tree.

Binary tree is a special type of tree in which each node can have at max 2 child nodes.

Postorder Traversal is a tree traversal technique, in which the first left subtree is traversed than the right subtree and the root is traversed at the end.

postorder traversal of the above tree: 8 4 2 7 9 6

Let’s take an example to understand the problem.

Input − binary tree in above example, node= 7

Output − 9

Explanation − we can see it in the post-order traversal of the binary tree.

To solve this problem, a simple, easy and noob’s solution will be simply finding the postorder traversal and then print the number next to it in the traversal.

But we need to learn a more effective solution,

An effective solution will involve using some general observation on the postorder traversal.

  • Since the root is the last node in postorder traversal, its successor is NULL.

  • In the case of the current node being the right child, the parent node is a successor.

  • In case of current node being left child, then

    • If the right sibling is absent, the successor is a parent node

    • If the right sibling exist then either the node or its leftmost child is successor.

This method is effective, the time complexity is O(h), his height of tree.

Example

Program to show the implementation of our solution,

 Live Demo

#include <iostream>
using namespace std;
struct Node {
   struct Node *left, *right, *parent;
   int value;
};
struct Node* insertNode(int value) {
   Node* temp = new Node;
   temp->left = temp->right = temp->parent = NULL;
   temp->value = value;
   return temp;
}
Node* findPostorderSuccessor(Node* root, Node* n) {
   if (n == root)
      return NULL;
   Node* parent = n->parent;
   if (parent->right == NULL || parent->right == n)
      return parent;
   Node* curr = parent->right;
   while (curr->left != NULL)
      curr = curr->left;
   return curr;
}
int main(){
   struct Node* root = insertNode(6);
   root->parent = NULL;
   root->left = insertNode(2);
   root->left->parent = root;
   root->left->left = insertNode(8);
   root->left->left->parent = root->left;
   root->left->right = insertNode(4);
   root->left->right->parent = root->left;
   root->right = insertNode(9);
   root->right->parent = root;
   root->right->left = insertNode(7);
   root->right->left->parent = root->right;
   root->left->right->left = insertNode(14);
   struct Node* successorNode = findPostorderSuccessor(root, root->left->right);
   if (successorNode)
      cout<<"Postorder successor of "<<root->left->right->value<<" is "<<successorNode->value;
   else
      cout<<"Postorder successor of "<<root->left->right->value<<" is NULL";
   return 0;
}

Output

Postorder successor of 4 is 2

Updated on: 17-Apr-2020

474 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements