/**
* 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) {
if(inorder == null || inorder.length == 0) return null;
//建立一个hash表,记录inorder数组的值->索引的映射
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i],i);
}
return helper(inorder,0,inorder.length-1,postorder,0,postorder.length-1,map);
}
public TreeNode helper(int[] inorder,int is,int ie,int[] postorder,int ps,int pe,Map<Integer,Integer> map){
if(is > ie || ps > pe) return null;
//取出根节点
TreeNode root = new TreeNode(postorder[pe]);
//获取当前根节点的值在中序数组的索引,并将数组分为两部分
int index = map.get(postorder[pe]);
//divided
TreeNode left = helper(inorder,is,index-1,postorder,ps,ps+index-is-1,map);
TreeNode right = helper(inorder,index+1,ie,postorder,ps+index-is,pe-1,map);
//conquer
root.left = left;
root.right = right;
return root;
}
}