Print Postorder traversal from given Inorder and Preorder traversals

21 Jun, 2022
Given Inorder and Preorder traversals of a binary tree, print Postorder traversal.
Example:
Input:
Inorder traversal in[] = {4, 2, 5, 1, 3, 6}
Preorder traversal pre[] = {1, 2, 4, 5, 3, 6}

Output:
Postorder traversal is {4, 5, 2, 6, 3, 1}
Traversals in the above example represents following tree 
         1
      /    \    
     2       3
   /   \      \
  4     5      6
A naive method is to first construct the tree, then use a simple recursive method to print postorder traversal of the constructed tree.
We can print postorder traversal without constructing the tree. The idea is, root is always the first item in preorder traversal and it must be the last item in postorder traversal. We first recursively print left subtree, then recursively print right subtree. Finally, print root. 
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
To find boundaries of left and right subtrees in pre[] and in[], we search root in in[], all elements before root in in[] are elements of left subtree, and all elements after root are elements of right subtree. In pre[], all elements after index of root in in[] are elements of right subtree. And elements before index (including the element at index and excluding the first element) are elements of left subtree.
Implementation:
C++
Java
Python3
C#
Javascript
// C++ program to print postorder traversal// from preorder and inorder traversals#include <iostream>using namespace std; // A utility function to search x in arr[] of size nint search(int arr[], int x, int n){    for (int i = 0; i < n; i++)        if (arr[i] == x)            return i;    return -1;} // Prints postorder traversal from given// inorder and preorder traversalsvoid printPostOrder(int in[], int pre[], int n){    // The first element in pre[] is always root, search it    // in in[] to find left and right subtrees    int root = search(in, pre[0], n);     // If left subtree is not empty, print left subtree    if (root != 0)        printPostOrder(in, pre + 1, root);     // If right subtree is not empty, print right subtree    if (root != n - 1)        printPostOrder(in + root + 1, pre + root + 1, n - root - 1);     // Print root    cout << pre[0] << " ";} // Driver program to test above functionsint main(){    int in[] = { 4, 2, 5, 1, 3, 6 };    int pre[] = { 1, 2, 4, 5, 3, 6 };    int n = sizeof(in) / sizeof(in[0]);    cout << "Postorder traversal " << endl;    printPostOrder(in, pre, n);    return 0;}
// Java program to print postorder// traversal from preorder and// inorder traversalsimport java.util.Arrays; class GFG{ // A utility function to search x in arr[] of size nstatic int search(int arr[], int x, int n){    for (int i = 0; i < n; i++)        if (arr[i] == x)            return i;    return -1;} // Prints postorder traversal from// given inorder and preorder traversalsstatic void printPostOrder(int in1[],                    int pre[], int n){    // The first element in pre[] is    // always root, search it in in[]    // to find left and right subtrees    int root = search(in1, pre[0], n);     // If left subtree is not empty,    // print left subtree    if (root != 0)        printPostOrder(in1, Arrays.copyOfRange(pre, 1, n), root);     // If right subtree is not empty,    // print right subtree    if (root != n - 1)        printPostOrder(Arrays.copyOfRange(in1, root+1, n),            Arrays.copyOfRange(pre, 1+root, n), n - root - 1);     // Print root    System.out.print( pre[0] + " ");} // Driver codepublic static void main(String args[]){    int in1[] = { 4, 2, 5, 1, 3, 6 };    int pre[] = { 1, 2, 4, 5, 3, 6 };    int n = in1.length;    System.out.println("Postorder traversal " );    printPostOrder(in1, pre, n);}}// This code is contributed by Arnab Kundu
# Python3 program to print postorder# traversal from preorder and inorder# traversals # A utility function to search x in# arr[] of size ndef search(arr, x, n):          for i in range(n):        if (arr[i] == x):            return i     return -1 # Prints postorder traversal from# given inorder and preorder traversalsdef printPostOrder(In, pre, n):         # The first element in pre[] is always    # root, search it in in[] to find left    # and right subtrees    root = search(In, pre[0], n)     # If left subtree is not empty,    # print left subtree    if (root != 0):        printPostOrder(In, pre[1:n], root)     # If right subtree is not empty,    # print right subtree    if (root != n - 1):        printPostOrder(In[root + 1 : n],                      pre[root + 1 : n],                      n - root - 1)     # Print root    print(pre[0], end = " ") # Driver codeIn = [ 4, 2, 5, 1, 3, 6 ]pre = [ 1, 2, 4, 5, 3, 6 ]n = len(In) print("Postorder traversal ") printPostOrder(In, pre, n) # This code is contributed by avanitrachhadiya2155
// C# program to print postorder// traversal from preorder and// inorder traversalsusing System; class GFG{ // A utility function to search x// in []arr of size nstatic int search(int []arr,                  int x, int n){    for (int i = 0; i < n; i++)        if (arr[i] == x)            return i;    return -1;} // Prints postorder traversal from// given inorder and preorder traversalsstatic void printPostOrder(int []in1,                    int []pre, int n){    // The first element in pre[] is    // always root, search it in in[]    // to find left and right subtrees    int root = search(in1, pre[0], n);     // If left subtree is not empty,    // print left subtree    int []ar;    if (root != 0)    {        ar = new int[n - 1];        Array.Copy(pre, 1, ar, 0, n - 1);        printPostOrder(in1, ar, root);    }         // If right subtree is not empty,    // print right subtree    if (root != n - 1)    {        ar = new int[n - (root + 1)];        Array.Copy(in1, root + 1, ar, 0,                        n - (root + 1));        int []ar1 = new int[n - (root + 1)];        Array.Copy(pre, root + 1, ar1, 0,                         n - (root + 1));        printPostOrder(ar, ar1, n - root - 1);    }         // Print root    Console.Write(pre[0] + " ");} // Driver codepublic static void Main(String []args){    int []in1 = { 4, 2, 5, 1, 3, 6 };    int []pre = { 1, 2, 4, 5, 3, 6 };    int n = in1.Length;    Console.WriteLine("Postorder traversal " );    printPostOrder(in1, pre, n);}} // This code is contributed by 29AjayKumar
<script> // javascript program to print postorder// traversal from preorder and// inorder traversals // A utility function to search x in arr of size nfunction search(arr , x , n){    for (var i = 0; i < n; i++)        if (arr[i] == x)            return i;    return -1;} // Prints postorder traversal from// given inorder and preorder traversalsfunction printPostOrder( in1,                    pre , n){    // The first element in pre is    // always root, search it in in    // to find left and right subtrees    var root = search(in1, pre[0], n);     // If left subtree is not empty,    // print left subtree    if (root != 0)        printPostOrder(in1, pre.slice(1, n), root);     // If right subtree is not empty,    // print right subtree    if (root != n - 1)        printPostOrder(in1.slice(root+1, n),            pre.slice(1+root, n), n - root - 1);     // Print root    document.write( pre[0] + " ");} // Driver codevar in1 = [ 4, 2, 5, 1, 3, 6 ];var pre = [ 1, 2, 4, 5, 3, 6 ];var n = in1.length;document.write("Postorder traversal <br>" );printPostOrder(in1, pre, n); // This code contributed by shikhasingrajput</script>
Postorder traversal 
4 5 2 6 3 1 
Implementation:
C++
Java
C#
Javascript
// C++ program to print Postorder// traversal from given Inorder// and Preorder traversals.#include <iostream>using namespace std; int preIndex = 0; int search(int arr[], int startIn,int endIn, int data){    int i = 0;    for (i = startIn; i < endIn; i++)    {        if (arr[i] == data)        {            return i;        }    }    return i;}void printPost(int arr[], int pre[],int inStrt, int inEnd){    if (inStrt > inEnd)    {        return;    }     // Find index of next item in preorder    // traversal in inorder.    int inIndex = search(arr, inStrt, inEnd,pre[preIndex++]);     // traverse left tree    printPost(arr, pre, inStrt, inIndex - 1);     // traverse right tree    printPost(arr, pre, inIndex + 1, inEnd);     // print root node at the end of traversal    cout << arr[inIndex] << " ";} // Driver codeint main(){    int arr[] = {4, 2, 5, 1, 3, 6};    int pre[] = {1, 2, 4, 5, 3, 6};    int len = sizeof(arr)/sizeof(arr[0]);    printPost(arr, pre, 0, len - 1);} // This code is contributed by SHUBHAMSINGH10
// Java program to print Postorder traversal from given Inorder// and Preorder traversals. public class PrintPost {    static int preIndex = 0;    void printPost(int[] in, int[] pre, int inStrt, int inEnd)    {        if (inStrt > inEnd)            return;                // Find index of next item in preorder traversal in        // inorder.        int inIndex = search(in, inStrt, inEnd, pre[preIndex++]);         // traverse left tree        printPost(in, pre, inStrt, inIndex - 1);         // traverse right tree        printPost(in, pre, inIndex + 1, inEnd);         // print root node at the end of traversal        System.out.print(in[inIndex] + " ");    }     int search(int[] in, int startIn, int endIn, int data)    {        int i = 0;        for (i = startIn; i < endIn; i++)            if (in[i] == data)                return i;                   return i;    }     // Driver code    public static void main(String ars[])    {        int in[] = { 4, 2, 5, 1, 3, 6 };        int pre[] = { 1, 2, 4, 5, 3, 6 };        int len = in.length;        PrintPost tree = new PrintPost();        tree.printPost(in, pre, 0, len - 1);    }}
// C# program to print Postorder// traversal from given Inorder// and Preorder traversals.using System; class GFG{public static int preIndex = 0;public virtual void printPost(int[] arr, int[] pre,                              int inStrt, int inEnd){    if (inStrt > inEnd)    {        return;    }     // Find index of next item in preorder    // traversal in inorder.    int inIndex = search(arr, inStrt, inEnd,                         pre[preIndex++]);     // traverse left tree    printPost(arr, pre, inStrt, inIndex - 1);     // traverse right tree    printPost(arr, pre, inIndex + 1, inEnd);     // print root node at the end of traversal    Console.Write(arr[inIndex] + " ");} public virtual int search(int[] arr, int startIn,                          int endIn, int data){    int i = 0;    for (i = startIn; i < endIn; i++)    {        if (arr[i] == data)        {            return i;        }    }    return i;} // Driver codepublic static void Main(string[] ars){    int[] arr = new int[] {4, 2, 5, 1, 3, 6};    int[] pre = new int[] {1, 2, 4, 5, 3, 6};    int len = arr.Length;    GFG tree = new GFG();    tree.printPost(arr, pre, 0, len - 1);}} // This code is contributed by Shrikant13
<script>       // JavaScript program to print Postorder      // traversal from given Inorder      // and Preorder traversals.      class GFG {        constructor() {          this.preIndex = 0;        }        printPost(arr, pre, inStrt, inEnd) {          if (inStrt > inEnd) {            return;          }           // Find index of next item in preorder          // traversal in inorder.          var inIndex = this.search(arr, inStrt, inEnd,          pre[this.preIndex++]);           // traverse left tree          this.printPost(arr, pre, inStrt, inIndex - 1);           // traverse right tree          this.printPost(arr, pre, inIndex + 1, inEnd);           // print root node at the end of traversal          document.write(arr[inIndex] + " ");        }         search(arr, startIn, endIn, data) {          var i = 0;          for (i = startIn; i < endIn; i++) {            if (arr[i] == data) {              return i;            }          }          return i;        }      }      // Driver code      var arr = [4, 2, 5, 1, 3, 6];      var pre = [1, 2, 4, 5, 3, 6];      var len = arr.length;      var tree = new GFG();      tree.printPost(arr, pre, 0, len - 1);       </script>
4 5 2 6 3 1
 
Time Complexity: The above function visits every node in array. For every visit, it calls search which takes O(n) time. Therefore, overall time complexity of the function is O(n2)
Implementation: The above solution can be optimized using hashing. We use a HashMap to store elements and their indexes so that we can quickly find index of an element. 
C++
Java
Python3
C#
Javascript
// C++ program to print Postorder traversal from// given Inorder and Preorder traversals.#include<bits/stdc++.h>using namespace std; int preIndex = 0;void printPost(int in[], int pre[], int inStrt,               int inEnd, map<int, int> hm){    if (inStrt > inEnd)        return;             // Find index of next item in preorder traversal in    // inorder.    int inIndex = hm[pre[preIndex++]];     // traverse left tree    printPost(in, pre, inStrt, inIndex - 1, hm);     // traverse right tree    printPost(in, pre, inIndex + 1, inEnd, hm);     // print root node at the end of traversal    cout << in[inIndex] << " ";} void printPostMain(int in[], int pre[],int n){    map<int,int> hm ;    for (int i = 0; i < n; i++)    hm[in[i]] = i;             printPost(in, pre, 0, n - 1, hm);} // Driver codeint main(){    int in[] = { 4, 2, 5, 1, 3, 6 };    int pre[] = { 1, 2, 4, 5, 3, 6 };    int n = sizeof(pre)/sizeof(pre[0]);         printPostMain(in, pre, n);    return 0;} // This code is contributed by Arnab Kundu
// Java program to print Postorder traversal from// given Inorder and Preorder traversals.import java.util.*; public class PrintPost {    static int preIndex = 0;    void printPost(int[] in, int[] pre, int inStrt,               int inEnd, HashMap<Integer, Integer> hm)    {        if (inStrt > inEnd)            return;                 // Find index of next item in preorder traversal in        // inorder.        int inIndex = hm.get(pre[preIndex++]);         // traverse left tree        printPost(in, pre, inStrt, inIndex - 1, hm);         // traverse right tree        printPost(in, pre, inIndex + 1, inEnd, hm);         // print root node at the end of traversal        System.out.print(in[inIndex] + " ");    }     void printPostMain(int[] in, int[] pre)    {        int n = pre.length;        HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();        for (int i=0; i<n; i++)           hm.put(in[i], i);                    printPost(in, pre, 0, n-1, hm);    }     // Driver code    public static void main(String ars[])    {        int in[] = { 4, 2, 5, 1, 3, 6 };        int pre[] = { 1, 2, 4, 5, 3, 6 };        PrintPost tree = new PrintPost();        tree.printPostMain(in, pre);    }}
# Python3 program to print Postorder traversal from# given Inorder and Preorder traversals. def printPost(inn, pre, inStrt, inEnd):    global preIndex, hm    if (inStrt > inEnd):        return     # Find index of next item in preorder traversal in    # inorder.    inIndex = hm[pre[preIndex]]    preIndex += 1     # traverse left tree    printPost(inn, pre, inStrt, inIndex - 1)     # traverse right tree    printPost(inn, pre, inIndex + 1, inEnd)     # print root node at the end of traversal    print(inn[inIndex], end = " ") def printPostMain(inn, pre, n):     for i in range(n):        hm[inn[i]] = i     printPost(inn, pre, 0, n - 1) # Driver codeif __name__ == '__main__':    hm = {}    preIndex = 0    inn = [4, 2, 5, 1, 3, 6]    pre = [1, 2, 4, 5, 3, 6]     n = len(pre)     printPostMain(inn, pre, n) # This code is contributed by mohit kumar 29
// C# program to print Postorder// traversal from given Inorder// and Preorder traversals.using System; class GFG{public static int preIndex = 0;public virtual void printPost(int[] arr, int[] pre,                              int inStrt, int inEnd){    if (inStrt > inEnd)    {        return;    }     // Find index of next item in preorder    // traversal in inorder.    int inIndex = search(arr, inStrt, inEnd,                         pre[preIndex++]);     // traverse left tree    printPost(arr, pre, inStrt, inIndex - 1);     // traverse right tree    printPost(arr, pre, inIndex + 1, inEnd);     // print root node at the    // end of traversal    Console.Write(arr[inIndex] + " ");} public virtual int search(int[] arr, int startIn,                          int endIn, int data){    int i = 0;    for (i = startIn; i < endIn; i++)    {        if (arr[i] == data)        {            return i;        }    }    return i;} // Driver codepublic static void Main(string[] ars){    int[] arr = new int[] {4, 2, 5, 1, 3, 6};    int[] pre = new int[] {1, 2, 4, 5, 3, 6};    int len = arr.Length;    GFG tree = new GFG();    tree.printPost(arr, pre, 0, len - 1);}} // This code is contributed by Shrikant13
<script> // Javascript program to print// Postorder traversal from given// Inorder and Preorder traversals.let preIndex = 0; function printPost(In, pre, inStrt, inEnd, hm){    if (inStrt > inEnd)        return;            // Find index of next item in    // preorder traversal in inorder.    let inIndex = hm.get(pre[preIndex++]);     // Traverse left tree    printPost(In, pre, inStrt, inIndex - 1, hm);     // Traverse right tree    printPost(In, pre, inIndex + 1, inEnd, hm);     // Print root node at the end of traversal    document.write(In[inIndex] + " ");} function printPostMain(In, pre){    let n = pre.length;    let hm = new Map();         for(let i = 0; i < n; i++)       hm.set(In[i], i);            printPost(In, pre, 0, n - 1, hm);} // Driver codelet In = [ 4, 2, 5, 1, 3, 6 ];let pre = [ 1, 2, 4, 5, 3, 6 ]; printPostMain(In, pre); // This code is contributed by unknown2108 </script>
4 5 2 6 3 1 
Time complexity: O(n) 
sainathcvs
shrikanth13
andrew1234
29AjayKumar
SHUBHAMSINGH10
mohit kumar 29
avanitrachhadiya2155
khushboogoyal499
unknown2108
rdtank
shikhasingrajput
sagartomar9927
simmytarika5
surinderdawra388
hardikkoriintern
Amazon
Java-HashMap
Payu
Tree
Amazon
Payu
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.