class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return buildTreeProcess(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode* buildTreeProcess(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd) {
if(preStart > preEnd || inStart > inEnd) return nullptr;
int i = 0;
for(i = inStart; i <= inEnd; i++) {
if(inorder[i] == preorder[preStart])
break;
}
int leftSize = i - inStart;
TreeNode *cur = new TreeNode(preorder[preStart]);
cur->left = buildTreeProcess(preorder, preStart+1, preStart + leftSize, inorder, inStart, i-1);
cur->right = buildTreeProcess(preorder, preStart + leftSize + 1, preEnd, inorder, i+1, inEnd);
return cur;
}
};