Open In App

Find n-th node in Postorder traversal of a Binary Tree

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given a Binary tree and a number N, write a program to find the N-th node in the Postorder traversal of the given Binary tree.

Prerequisite: Tree Traversal

Examples:  

Input : N = 4
              11
            /   \
           21    31
         /   \
        41     51
Output : 31
Explanation: Postorder Traversal of given Binary Tree is 41 51 21 31 11, 
so 4th node will be 31.

Input : N = 5
             25
           /    \
          20    30
        /    \ /   \
      18    22 24   32
Output : 32

The idea to solve this problem is to do postorder traversal of the given binary tree and keep track of the count of nodes visited while traversing the tree and print the current node when the count becomes equal to N.

Below is the implementation of the above approach:  

C++




// C++ program to find n-th node of
// Postorder Traversal of Binary Tree
#include <bits/stdc++.h>
using namespace std;
 
// node of tree
struct Node {
    int data;
    Node *left, *right;
};
 
// function to create a new node
struct Node* createNode(int item)
{
    Node* temp = new Node;
    temp->data = item;
    temp->left = NULL;
    temp->right = NULL;
 
    return temp;
}
 
// function to find the N-th node in the postorder
// traversal of a given binary tree
void NthPostordernode(struct Node* root, int N)
{
    static int flag = 0;
 
    if (root == NULL)
        return;
 
    if (flag <= N) {
 
        // left recursion
        NthPostordernode(root->left, N);
 
        // right recursion
        NthPostordernode(root->right, N);
 
        flag++;
 
        // prints the n-th node of preorder traversal
        if (flag == N)
            cout << root->data;
    }
}
 
// driver code
int main()
{
    struct Node* root = createNode(25);
    root->left = createNode(20);
    root->right = createNode(30);
    root->left->left = createNode(18);
    root->left->right = createNode(22);
    root->right->left = createNode(24);
    root->right->right = createNode(32);
 
    int N = 6;
 
    // prints n-th node found
    NthPostordernode(root, N);
 
    return 0;
}


Java




// Java program to find n-th node of
// Postorder Traversal of Binary Tree
public class NthNodePostOrder {
 
    static int flag = 0;
 
    // function to find the N-th node in the postorder
    // traversal of a given binary tree
    public static void NthPostordernode(Node root, int N)
    {
   
        if (root == null)
            return;
   
        if (flag <= N)
        {  
            // left recursion
            NthPostordernode(root.left, N);
            // right recursion
            NthPostordernode(root.right, N);
            flag++;
            // prints the n-th node of preorder traversal
            if (flag == N)
                System.out.print(root.data);
        }
    }
 
 
    public static void main(String args[]) {
        Node root = new Node(25);
        root.left = new Node(20);
        root.right = new Node(30);
        root.left.left = new Node(18);
        root.left.right = new Node(22);
        root.right.left = new Node(24);
        root.right.right = new Node(32);
   
        int N = 6;
   
        // prints n-th node found
        NthPostordernode(root, N);
    }
}
 
/* A binary tree node structure */
class Node
{
    int data;
    Node left, right;
    Node(int data)
    {
        this.data=data;
    }
};
// This code is contributed by Gaurav Tiwari


Python3




"""Python3 program to find n-th node of
Postorder Traversal of Binary Tree"""
 
# A Binary Tree Node
# Utility function to create a new tree node
class createNode:
 
    # Constructor to create a newNode
    def __init__(self, data):
        self.data= data
        self.left = None
        self.right = None
 
# function to find the N-th node
# in the postorder traversal of
# a given binary tree
flag = [0]
def NthPostordernode(root, N):
 
    if (root == None):
        return
 
    if (flag[0] <= N[0]):
         
        # left recursion
        NthPostordernode(root.left, N)
 
        # right recursion
        NthPostordernode(root.right, N)
 
        flag[0] += 1
 
        # prints the n-th node of
        # preorder traversal
        if (flag[0] == N[0]):
            print(root.data)
                         
# Driver Code
if __name__ == '__main__':
    root = createNode(25)
    root.left = createNode(20)
    root.right = createNode(30)
    root.left.left = createNode(18)
    root.left.right = createNode(22)
    root.right.left = createNode(24)
    root.right.right = createNode(32)
 
    N = [6]
 
    # prints n-th node found
    NthPostordernode(root, N)
 
# This code is contributed by
# SHUBHAMSINGH10


C#




// C# program to find n-th node of
// Postorder Traversal of Binary Tree
using System;
 
public class NthNodePostOrder
{
 
    /* A binary tree node structure */
    public class Node
    {
        public int data;
        public Node left, right;
        public Node(int data)
        {
            this.data=data;
        }
    }
    static int flag = 0;
 
    // function to find the N-th node in the postorder
    // traversal of a given binary tree
    static void NthPostordernode(Node root, int N)
    {
        if (root == null)
            return;
     
        if (flag <= N)
        {
            // left recursion
            NthPostordernode(root.left, N);
             
            // right recursion
            NthPostordernode(root.right, N);
            flag++;
             
            // prints the n-th node of preorder traversal
            if (flag == N)
                Console.Write(root.data);
        }
    }
 
    // Driver code
    public static void Main(String []args)
    {
        Node root = new Node(25);
        root.left = new Node(20);
        root.right = new Node(30);
        root.left.left = new Node(18);
        root.left.right = new Node(22);
        root.right.left = new Node(24);
        root.right.right = new Node(32);
     
        int N = 6;
     
        // prints n-th node found
        NthPostordernode(root, N);
    }
}
 
// This code is contributed by Arnab Kundu


Javascript




<script>
 
// JavaScript program to find n-th node of
// Postorder Traversal of Binary Tree
/* A binary tree node structure */
class Node
{
    constructor(data)
    {
        this.left = null;
        this.right = null;
        this.data = data;
    }
}
 
var flag = 0;
// function to find the N-th node in the postorder
// traversal of a given binary tree
function NthPostordernode(root, N)
{
    if (root == null)
        return;
 
    if (flag <= N)
    {
        // left recursion
        NthPostordernode(root.left, N);
         
        // right recursion
        NthPostordernode(root.right, N);
        flag++;
         
        // prints the n-th node of preorder traversal
        if (flag == N)
            document.write(root.data);
    }
}
 
// Driver code
var root = new Node(25);
root.left = new Node(20);
root.right = new Node(30);
root.left.left = new Node(18);
root.left.right = new Node(22);
root.right.left = new Node(24);
root.right.right = new Node(32);
var N = 6;
// prints n-th node found
NthPostordernode(root, N);
 
</script>


Output

30

Complexity Analysis:

  • Time Complexity: O(n)
    Where n is the number of nodes in the given binary tree. 
  • Auxiliary Space: O(h)
    Where h is the height of the tree. The extra space used is due to the recursion function call stack. In the worst case (if the tree is skewed) this can go upto O(n).

Iterative Approach:

The idea to solve this problem is to do iterative postorder traversal of the given binary tree and keep track of the count of nodes visited while traversing the tree and print the current node when the count becomes equal to N.

Below is the implementation of the above approach:  

C++




// C++  program to find nth node of
// postorder traversal of Binary Tree
#include <bits/stdc++.h>
using namespace std;
 
// structure of Tree node
struct Node {
    int data;
    Node *left, *right;
};
 
// fun to create a new node
Node* createNode(int item)
{
    Node* temp = new Node();
    temp->data = item;
    temp->left = temp->right = NULL;
    return temp;
}
 
// fun to find nth node in the postorder traversal of a
// given binary tree
void Nthpostordernode(Node* root, int N)
{
    // base case
    if (!root)
        return;
 
    int cnt = 0;
 
    stack<Node*> s;
    Node* curr = root;
 
    // do iterative postorder traversal as discussed in this
    // post -
    while (!s.empty() || curr != NULL) {
 
        // push all left nodes into stack
        while (curr) {
            s.push(curr);
            curr = curr->left;
        }
 
        Node* temp = s.top()->right;
        // check if right node exists, if not make curr
        // point to temp as we traverse first left nodes,
        // then right nodes followed by root node
        if (!temp) {
            temp = s.top();
            s.pop();
 
            // do cnt++ and check for the nth node
            cnt++;
            if (cnt == N) {
                cout << temp->data << " ";
                return;
            }
            while (!s.empty() && s.top()->right == temp) {
                temp = s.top();
                s.pop();
                cnt++;
                if (cnt == N) {
                    cout << temp->data << " ";
                    return;
                }
            }
        }
        else
            curr = temp;
    }
}
 
// driver code
int main()
{
    // create a tree
    Node* root = createNode(25);
    root->left = createNode(20);
    root->right = createNode(30);
    root->left->left = createNode(18);
    root->left->right = createNode(22);
    root->right->left = createNode(24);
    root->right->right = createNode(32);
 
    int N = 6;
 
    Nthpostordernode(root, N);
 
    return 0;
}
// This code is contributed by Modem Upendra


Java




// Java program to find nth node of
// postorder traversal of Binary Tree
import java.util.*;
 
// class for Tree node
class Node {
    int data;
    Node left, right;
 
    Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
// class to find nth node in the postorder traversal of a
// given binary tree
class NthPostOrderNode {
    // function to find nth node in the postorder traversal
    // of a given binary tree
    static void findNthPostOrderNode(Node root, int N)
    {
        // base case
        if (root == null) {
            return;
        }
 
        int cnt = 0;
 
        Stack<Node> s = new Stack<Node>();
        Node curr = root;
 
        // do iterative postorder traversal as discussed in
        // this post -
        while (!s.empty() || curr != null) {
            // push all left nodes into stack
            while (curr != null) {
                s.push(curr);
                curr = curr.left;
            }
 
            Node temp = s.peek().right;
            // check if right node exists, if not make curr
            // point to temp as we traverse first left
            // nodes, then right nodes followed by root node
            if (temp == null) {
                temp = s.pop();
 
                // do cnt++ and check for the nth node
                cnt++;
                if (cnt == N) {
                    System.out.print(temp.data + " ");
                    return;
                }
                while (!s.empty()
                       && s.peek().right == temp) {
                    temp = s.pop();
                    cnt++;
                    if (cnt == N) {
                        System.out.print(temp.data + " ");
                        return;
                    }
                }
            }
            else {
                curr = temp;
            }
        }
    }
 
    // driver code
    public static void main(String[] args)
    {
        // create a tree
        Node root = new Node(25);
        root.left = new Node(20);
        root.right = new Node(30);
        root.left.left = new Node(18);
        root.left.right = new Node(22);
        root.right.left = new Node(24);
        root.right.right = new Node(32);
 
        int N = 6;
 
        findNthPostOrderNode(root, N);
    }
}


Python




# python program to find nth node of
# postorder traversal of binary tree
# structure of tree node
class Node:
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
 
# function to create a new node
def createNode(item):
    temp = Node(item)
    return temp
 
 
# function to find the nth node in the postorder traversal
def Nthpostordernode(root, N):
    # base case
    if(root is None):
        return
 
    cnt = 0
    s = []
    curr = root
 
    # do iterative postorder traversal
    while(len(s) > 0 or curr is not None):
        # push all left nodes into stack
        while(curr is not None):
            s.append(curr)
            curr = curr.left
 
        temp = s[len(s) - 1].right
        # check if right node exist, if not make curr
        # point to temp as we traverse first left nodes,
        # then right nodes followed by root node
        if(temp is None):
            temp = s.pop()
 
            # do cnt++ and check for the nth node
            cnt = cnt+1
            if(cnt == N):
                print(temp.data)
                return
            while(len(s) > 0 and s[len(s)-1].right == temp):
                temp = s.pop()
                cnt += 1
                if(cnt == N):
                    print(temp.data)
                    return
 
        else:
            curr = temp
 
 
# driver code
# create tree
root = createNode(25)
root.left = createNode(20)
root.right = createNode(30)
root.left.left = createNode(18)
root.left.right = createNode(22)
root.right.left = createNode(24)
root.right.right = createNode(32)
 
N = 6
Nthpostordernode(root, N)
 
# this code is contributed by Kirti Agarwal


C#




using System;
using System.Collections.Generic;
 
// class for Tree node
class Node
{
  public int data;
  public Node left, right;
 
  public Node(int item)
  {
    data = item;
    left = right = null;
  }
}
 
// class to find nth node in the postorder traversal of a
// given binary tree
class NthPostOrderNode
{
  // function to find nth node in the postorder traversal
  // of a given binary tree
  static void FindNthPostOrderNode(Node root, int N)
  {
    // base case
    if (root == null)
    {
      return;
    }
 
    int cnt = 0;
 
    Stack<Node> s = new Stack<Node>();
    Node curr = root;
 
    // do iterative postorder traversal as discussed in
    // this post -
    while (s.Count > 0 || curr != null)
    {
      // push all left nodes into stack
      while (curr != null)
      {
        s.Push(curr);
        curr = curr.left;
      }
 
      Node temp = s.Peek().right;
      // check if right node exists, if not make curr
      // point to temp as we traverse first left
      // nodes, then right nodes followed by root node
      if (temp == null)
      {
        temp = s.Pop();
 
        // do cnt++ and check for the nth node
        cnt++;
        if (cnt == N)
        {
          Console.Write(temp.data + " ");
          return;
        }
        while (s.Count > 0 && s.Peek().right == temp)
        {
          temp = s.Pop();
          cnt++;
          if (cnt == N)
          {
            Console.Write(temp.data + " ");
            return;
          }
        }
      }
      else
      {
        curr = temp;
      }
    }
  }
 
  // driver code
  public static void Main()
  {
    // create a tree
    Node root = new Node(25);
    root.left = new Node(20);
    root.right = new Node(30);
    root.left.left = new Node(18);
    root.left.right = new Node(22);
    root.right.left = new Node(24);
    root.right.right = new Node(32);
 
    int N = 6;
 
    FindNthPostOrderNode(root, N);
  }
}


Javascript




// JavaScript program to find the nth node of
// postorder traversal of binary tree
 
// structure of tree node
class Node{
    constructor(item){
        this.data = item;
        this.left = null;
        this.right = null;
    }
}
 
// function to create a new node
function createNode(item){
    return new Node(item);
}
 
// function to find nth node in the postorder
// traversal of a given binary tree
function Nthpostordernode(root, N){
    // base cas
    if(root == null)
        return;
     
    let cnt = 0;
     
    let s = [];
    let curr = root;
     
    // do iterative postorder traversal
    while(s.length > 0 || curr != null){
        // push all left nodes into stack
        while(curr != null){
            s.push(curr);
            curr = curr.left;
        }
         
        let temp = s[s.length - 1].right;
        // check if right node exists, if not make curr
        // point to temp as we traverse first left nodes,
        // then right nodes followed by root node
        if(temp == null){
            temp = s.pop();
             
            // do cnt++ and check for the nth node
            cnt++;
            if(cnt == N){
                document.write(temp.data + " ") ;
                return;
            }
            while(s.length > 0 && s[s.length-1].right == temp){
                temp = s.pop();
                cnt++;
                if(cnt == N){
                    document.write(temp.data + " ");
                    return;
                }
            }
        }
        else{
            curr = temp;
        }
    }
}
 
// driver code
let root = createNode(25);
root.left = createNode(20);
root.right = createNode(30);
root.left.left = createNode(18);
root.left.right = createNode(22);
root.right.left = createNode(24);
root.right.right = createNode(32);
 
let N = 6;
 
Nthpostordernode(root, N);
 
// This code is contributed by Yash Agarwal(yashagarwal2852002)


Output

30 

Complexity Analysis:

  • Time Complexity: O(n)
    Where n is the number of nodes in the given binary tree. 
  • Auxiliary Space: O(h)
    Where h is the height of the tree. The extra space used is due to the recursion function call stack. In the worst case (if the tree is skewed) this can go upto O(n).


Last Updated : 28 Feb, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads