package com.interview.tree; /** * Date 11/02/2015 * @author Tushar Roy * * Given a preorder/inorder traversal of binary tree create postorder traversal of binary tree * without creating the tree * * Time complexity - O(n) * * References * http://www.geeksforgeeks.org/print-postorder-from-given-inorder-and-preorder-traversals/ */ import java.util.concurrent.atomic.AtomicInteger; public class PrintPostOrderFromPreOrderInOrder { public int[] postOrder(int[] preorder, int[] inorder) { int[] post = new int[inorder.length]; AtomicInteger postIndex = new AtomicInteger(post.length - 1); postOrder(preorder, inorder, post, 0, inorder.length -1, 0, postIndex); return post; } private void postOrder(int[] preorder, int[] inorder, int post[], int low, int high, int preIndex, AtomicInteger postIndex) { if(low > high) { return; } post[postIndex.getAndDecrement()] = preorder[preIndex]; int i; for(i=0; i < inorder.length; i++) { if(preorder[preIndex] == inorder[i]) { break; } } postOrder(preorder, inorder, post, i+1, high, preIndex + (i - low) + 1, postIndex); postOrder(preorder, inorder, post, low, i-1, preIndex + 1, postIndex); } public static void main(String args[]) { int preorder[] = {10, 5, 3, 21, 20, 18, 9 , 16}; int inorder[] = {3, 5, 21, 10, 18, 9, 20, 16}; PrintPostOrderFromPreOrderInOrder ppp = new PrintPostOrderFromPreOrderInOrder(); int postorder[] = ppp.postOrder(preorder, inorder); for(int i : postorder) { System.out.print(i + " "); } } }