class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
return construct(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
}
private:
TreeNode* construct(const vector<int> pre, int preBegin, int preEnd,
const vector<int> vin, int vinBegin, int vinEnd) {
if (preBegin > preEnd) return nullptr;
TreeNode* root = new TreeNode(pre[preBegin]);
int i;
for (i = vinBegin; i <= vinEnd; ++i) {
if (vin[i] == pre[preBegin]) break;
}
int vinLeftBegin = vinBegin;
int vinLeftEnd = i - 1;
int vinRightBegin = i + 1;
int vinRightEnd = vinEnd;
int preLeftBegin = preBegin + 1;
int preLeftEnd = preLeftBegin + (vinLeftEnd - vinLeftBegin);
int preRightBegin = preLeftEnd + 1;
int preRightEnd = preEnd;
root->left = construct(pre, preLeftBegin, preLeftEnd, vin, vinLeftBegin, vinLeftEnd);
root->right = construct(pre, preRightBegin, preRightEnd, vin, vinRightBegin, vinRightEnd);
return root;
}
};