import java.util.*;

// public class TreeNode {
//     int val = 0;
//     TreeNode left = null;
//     TreeNode right = null;
//     public TreeNode(int val) {
//         this.val = val;
//     }
// }

[1,2,4,7,3,5,6,8]
[4,7,2,1,5,3,8,6]


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param preOrder int整型一维数组
     * @param vinOrder int整型一维数组
     * @return TreeNode类
     */
    public TreeNode solve(int[] preOrder, int preLeft, int preRight, int[] vinOrder,
                          int vinLeft, int vinRight) {
        if (preLeft > preRight) {
            return null;
        }
        int headVal = preOrder[preLeft];
        TreeNode head = new TreeNode(headVal);
        int partition = -1;
        int l_preLeft, l_preRight, l_vinLeft, l_vinRight;
        int r_preLeft, r_preRight, r_vinLeft, r_vinRight;
        // 由中序排列确定划分 
        for (int i = vinLeft; i <= vinRight; ++i) {
            if (vinOrder[i] == headVal) {
                partition = i;
                break;
            }
        }
        l_vinLeft = vinLeft;
        l_vinRight = partition - 1;
        r_vinLeft = partition + 1;
        r_vinRight = vinRight;

        l_preLeft = preLeft + 1; // 左子前序起点
        l_preRight = preLeft + partition - vinLeft;
        r_preLeft = l_preRight + 1;
        r_preRight = preRight;

        head.left = solve(preOrder, l_preLeft, l_preRight, vinOrder, l_vinLeft, l_vinRight);
        head.right = solve(preOrder, r_preLeft, r_preRight, vinOrder, r_vinLeft, r_vinRight);
        return head;
    }
    public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
        // write code here
        return solve(preOrder, 0, preOrder.length - 1, vinOrder, 0, vinOrder.length - 1);

    }
}