/**
* Given inorder and postorder traversal of a tree, construct the binary tree.
*
* Note:
* You may assume that duplicates do not exist in the tree.
*
* Tags: Tree, Array, DFS
*/
class ConstructBTFromInPostOrder {
public static void main(String[] args) {
}
/**
* DFS, find root, find range of left and right sub trees
* The calculation of post array is trivial
* For left subtree, ps = ps, pe = ps - is - 1 + pos(offset, including root)
* For right subtree, ps = pe - ie + pos, pe = pe - 1(without root)
*/
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder == null || postorder == null) return null;
return buildTree(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
}
public TreeNode buildTree(int[] inorder, int[] postorder, int is, int ie, int ps, int pe) {
if (ps > pe) return null;
TreeNode root = new TreeNode(postorder[pe]);
int pos = is;
for (; pos <= ie; pos++) {
if (inorder[pos] == root.val) break;
}
// Note how to calcuclate the start and end indices for post array
root.left = buildTree(inorder, postorder, is, pos - 1, ps, ps - is - 1 + pos);
root.right = buildTree(inorder, postorder, pos + 1, ie, pe - ie + pos, pe - 1);
return root;
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
}