#106 - Construct Binary Tree from Inorder and Postorder Traversal
class Solution {
private TreeNode findTree(Integer[] inorder, int i1, int i2, Integer[] postorder, int p1, int p2) {
if (i2 <= i1 || p2 <= p1) return null;
TreeNode root = new TreeNode(postorder[p2 - 1]);
int i2p = Arrays.asList(inorder).indexOf(postorder[p2 - 1]);
int diff = i2p - i1;
root.left = findTree(inorder, i1, i2p, postorder, p1, p1+diff);
root.right = findTree(inorder, i2p+1, i2, postorder, p1+diff, p2-1);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
int n = inorder.length;
if (n == 0) return null;
Integer[] inord = new Integer[n];
Integer[] postord = new Integer[n];
for (int i = 0; i < n; ++i) {
inord[i] = inorder[i];
postord[i] = postorder[i];
}
return findTree(inord, 0, n, postord, 0, n);
}
}