import java.util.HashMap;
/**
* 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[] afterorder, int[] inorder) {
int hb=0;
int he=afterorder.length-1;
int zb =0;
int ze = inorder.length-1;
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<=ze;i++){
map.put(inorder[i], i);
}
TreeNode treeNode = re( map,afterorder, hb, he, zb, ze);
return treeNode;
}
public TreeNode re(HashMap map,int[] after,int hb,int he,int zb,int ze) {
if(hb>he)return null;
TreeNode mid = new TreeNode(after[he]);
if(hb==he)return mid;
int k = (int) map.get(after[he]);
TreeNode left = re(map, after, hb, hb+k-zb-1, zb, k-1);
TreeNode right = re(map, after, hb+k-zb, he-1, k+1, ze);
mid.left = left;
mid.right = right;
return mid;
}
public static void main(String[] args) {
Solution so = new Solution();
int[] afterorder = new int[]{9,15,7,20,3};
int[] inorder = new int[]{9,3,15,20,7};
so.buildTree(afterorder, inorder);
}
}