/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} //可用于初始化
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int m=pre.size(),n=vin.size();
        if(m!=n||m==0) return NULL;
        return reconstruct(pre,vin,0,m-1,0,n-1);
    }
    TreeNode* reconstruct(vector<int> &pre,vector<int> &vin,int l1,int r1,int l2,int r2){
            TreeNode* root=new TreeNode(pre[l1]); //创建根节点,并初始化。利用树节点的定义初始化。
            if(l1==r1) return root; //如果只有一个节点则返回该节点,也就是根节点
            int indexnum=l2; //indexnum用来表示根节点在中序遍历数组vin中的索引数字,即位置。初始值设置为l2
            while(indexnum<=r2&&pre[l1]!=vin[indexnum]) indexnum++; //遍历数组vin,找根节点在中序遍历中的位置
            int leftlength=indexnum-l2; //根节点的左子树的节点个数
            int rightlength=r2-indexnum; //根节点的右子树的节点个数
            if(leftlength>0){ //左子树有节点时,递归构造左子树
                root->left=reconstruct(pre,vin,l1+1,l1+leftlength,l2,indexnum-1);
            }
            if(rightlength>0){ //右子树有节点时,递归构造右子树
                root->right=reconstruct(pre,vin,l1+leftlength+1,r1,indexnum+1,r2);
            }
            return root; //返回根节点
    }
};