import java.util.*;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

public class Solution {
  /*
  其实只要了解前序和中序遍历的特点就大概知道解题思路了,前序遍历是根-》左-》右 中序遍历是左-》根-》右,前序遍历的第一个元素其实就是中序遍历的头节点,然后我们根据这个头结点,找到中序遍历结果中对应的位置,就知道了当前节点左边和右边的元素分别有哪些,然后再去递归计算就好了
  
  */
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        if(pre==null||vin==null||pre.length!=vin.length){
            return null;
        }
        int len=pre.length;
        for(int i=0;i<len;i++){
            map.put(vin[i],i);
        }
        return reBuildBinTree(pre,vin,0,len-1,0,len-1);
    }
    public TreeNode reBuildBinTree(int[] pre,int[] vin,int pL,int pR,int vL,int vR){
        if(pL>pR||vL>vR){
            return null;
        }
        int index=map.get(pre[pL]);
        TreeNode root=new TreeNode(pre[pL]);
        root.left=reBuildBinTree(pre,vin,pL+1,pL+index-vL,vL,index-1);
        root.right=reBuildBinTree(pre,vin,pL+index-vL+1,pR,index+1,vR);
        return root;
    }
}