public HashMap<Integer,Integer> map;
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder == null || postorder.length == 0 || inorder == null || inorder.length == 0 ) {
return null;
}
map=new HashMap<Integer,Integer>();
for (int i = 0; i < inorder.length; ++i){
map.put(inorder[i],i);
}
int right1 = inorder.length-1;
int right2 = postorder.length-1;
return build(inorder,0,right1,postorder,0,right2);
}
public TreeNode build(int[] inorder, int left1, int right1,
int[] postorder, int left2, int right2) {
if (left1 > right1 || left2 > right2){
return null;
}
TreeNode root = new TreeNode(postorder[right2]);
//get the index of current root in inorder array
//new inorder-->(left1,mid-1) && (mid+1,right1)
int mid = map.get(postorder[right2]);
//用num记录下次遍历的数组的长度,好计算left和right
int num = mid-left1;
//dfs: 注意上面的范围
root.left = build(inorder, left1, mid-1, postorder, left2, left2+num-1);
root.right = build(inorder, mid+1, right1, postorder, left2+num, right2-1);
return root;
}