Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7] postorder = [9,15,7,20,3]
Return the following binary tree:
3 / \ 9 20 / \ 15 7
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder, 0, inorder.length,
postorder, 0, postorder.length);
}
private TreeNode buildTree(int[] inorder, int b1, int e1,
int[] postorder, int b2, int e2) {
if (b1 == e1)
return null;
if (b2 == e2)
return null;
TreeNode root = new TreeNode(postorder[e2 - 1]);
int inPos = find(inorder, b1, e1, root.val);
int leftSize = inPos - b1;
root.left = buildTree(inorder, b1, inPos,
postorder, b2, b2 + leftSize);
root.right = buildTree(inorder, inPos + 1, e1,
postorder, b2 + leftSize, e2 - 1);
return root;
}
private int find(int[] array, int b, int e, int val) {
for (int i = b; i < e; i++) {
if (array[i] == val)
return i;
}
return -1;
}
}