/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/*
* pre: 前序数组
* lp:pre及其子数组的左起始下标
* rp: pre及其子数组的右结尾下标
* vin :中序数组
* li: vin及其子数组的左起始下标
* ri: vin及其子数组的右结尾下标
*/
static struct TreeNode* rebuild_tree(int *pre, int lp, int rp, int *vin, int li, int ri)
{
    if (lp > rp || li > ri) {
        return NULL;
    }
    struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = pre[lp];
    int in_offset = 0;  /* 表示前序数组中的根节点值在中序数组的位置偏移,等于前序数组的左子树的节点个数 */
    for (int i = li; i <= ri; i++) {
        if (pre[lp] == vin[i]) {
            break;
        }
        in_offset++;
    }
    root->left = rebuild_tree(pre, lp + 1, lp + in_offset, vin, li, li + in_offset - 1);
    root->right = rebuild_tree(pre, lp + in_offset + 1, rp, vin, li + in_offset + 1, ri);
    return root;
}
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pre int整型一维数组 
 * @param preLen int pre数组长度
 * @param vin int整型一维数组 
 * @param vinLen int vin数组长度
 * @return TreeNode类
 */
struct TreeNode* reConstructBinaryTree(int* pre, int preLen, int* vin, int vinLen ) {
    // write code here
    if (pre == NULL || vin == NULL || preLen <= 0 || vinLen <=0) {
        return NULL;
    }
    return rebuild_tree(pre, 0, preLen - 1, vin, 0, vinLen -1);
}