就是利用前序序列找到头,然后在中序序列中找到这个头的位置h,h左边就是左子树,h右边就是右子树,然后递归就可以了

    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
        if(pre==null||vin==null||pre.length==0||pre.length!=vin.length) return null;
        return reBuildTree(pre,0,pre.length-1,vin,0,pre.length-1);
    }
    public TreeNode reBuildTree(int[] pre,int s1,int e1,int[] vin,int s2,int v2){
        if(s1>e1||s2>v2){
            return null;
        }
        if(e1==s1||s2==v2){
            return new TreeNode(pre[e1]);
        }
        //头是pre[s1]
        TreeNode head = new TreeNode(pre[s1]);
        //在vin中找到头的下标
        int h = s2;
        while(vin[h]!=pre[s1]){
            h++;
        }
        //h-s2就能知道左子树长度了
        //左边右边重建
        int leftLen = h-s2;
        head.left = reBuildTree(pre,s1+1,s1+leftLen,vin,s2,h-1);
        head.right = reBuildTree(pre,s1+leftLen+1,e1,vin,h+1,v2);
        return head;
    }