import java.util.*;
public class Solution {
    HashMap<Integer,Integer> map;
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        int preLen = pre.length;
        int inLen = in.length;
        if(pre.length != in.length){
            throw new RuntimeException("输入有误!");
        }

        //需要频繁在中序中找到根结点的位置,使用map将数组的遍历查询改为直接查询
        map = new HashMap();
        for(int index = 0; index < in.length; index++){
            map.put(in[index],index);
        }

        return build(pre, 0, preLen-1, in, 0, inLen-1);
    }


    private TreeNode build(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd){
        //1. 终止条件
        if(preStart > preEnd || inStart > inEnd){
            return null;
        }

        //2. 创建根结点
        TreeNode root = new TreeNode(pre[preStart]);

        //3. 在中序中找到根结点位置,即左右子树的分割界限
        int inindex = map.get(pre[preStart]);

        //4. 在前序中找到左右子树的分割界限:左子树的最后一位元素索引
        int preindex = inindex - inStart + preStart;

        //5. 递归获取左右子树根结点,连接在根结点上
        root.left = build(pre, preStart+1, preindex, in, inStart, inindex-1);
        root.right = build(pre, preindex+1, preEnd, in, inindex+1, inEnd);

        //6. 返回根结点
        return root;
    }
}