/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
#include <vector>
class Solution {
public:
    TreeNode* reBuild(vector<int>& preorder,vector<int>& inorder) {
        if (preorder.size() == 0) return nullptr;
        
        // 找到先序遍历中的第一个元素就是根节点
        int rootValue = preorder[0];
        TreeNode* pRoot = new TreeNode(rootValue);
        
        // 找到中序遍历中的切割点
        int partition;
        for (partition = 0; partition < inorder.size(); ++partition) {
            if (inorder[partition] == rootValue) break;
        }

        // 切割中序数组,得到中序左子树和中序的右子树
        vector<int> leftInorder(inorder.begin(), inorder.begin() + partition);
        vector<int> rightInorder(inorder.begin() + partition + 1, inorder.end());

        // 切割先序数组,得到先序左子树和先序右子树
        // [ 1, leftInorder.size )
        vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + 1 + leftInorder.size());
        // [leftInorder.size, end)
        vector<int> rightPreorder(preorder.begin() + 1 + leftInorder.size(), preorder.end());

        // pRoot->left = reConstructBinaryTree(先序左子树, 中序左子树)
        // pRoot->right = reConstructBinaryTree(先序右子树, 中序右子树)

        pRoot->left = reConstructBinaryTree(leftPreorder, leftInorder);
        pRoot->right = reConstructBinaryTree(rightPreorder, rightInorder);
        return pRoot;
    }

    TreeNode* reConstructBinaryTree(vector<int>& preorder,vector<int>& inorder) {
        if (preorder.size() == 0 || inorder.size() == 0) return nullptr;
        return reBuild(preorder, inorder);
    }

};