前序遍历性质: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序。

中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。

中序遍历 定位root位置 可以计算出左右子树的长度

由前序遍历 左子树的第一个节点就是左孩子 右子树第一个节点就是右孩子,右子树的长度由root长度 + 左子树的长度(由中序遍历的 根节点位置-left )

其中 root 是根节点在前序遍历中的位置 根节点的位置都是在前序遍历中寻找
left right 是当前子树 在中序遍历中的左右边界。
TreeNode recur(int root, int left, int right)

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

public class Solution {
    int[] pre; 
    HashMap<Integer, Integer> dic = new HashMap<>();
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        this.pre = pre;
        for(int i = 0; i < vin.length; i++)
            dic.put(vin[i], i);
        return recur(0, 0, vin.length - 1);
    }
    public TreeNode recur(int root, int left, int right){
        if(left>right){return null;}

        TreeNode RootNode = new TreeNode(pre[root]);
        int idx = dic.get(pre[root]);

        RootNode.left = recur(root+1,left,idx-1);
        RootNode.right = recur(root + idx-left +1,idx+1,right);
        return RootNode;
    }
}