class Solution
{
public:
TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right, vector<int>& vin, int vin_left, int vin_right)
{
if (pre_left > pre_right || vin_left > vin_right) return nullptr;
int root_val = pre[pre_left]; // 记录的是子树根结点上的val值
TreeNode* root = new TreeNode(root_val);
for (int i=vin_left; i<=vin_right; ++i)
{
if (vin[i] == root_val)
{
root->left = rebuild(pre, pre_left+1, pre_left+i-vin_left, vin, vin_left, i-1);
root->right = rebuild(pre, pre_left+i-vin_left+1, pre_right, vin, i+1, vin_right);
break;
}
}
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin)
{
return rebuild(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
}
};