key:
1. 递归的返回条件:ps > pe;
2. 左右子树的索引更新:其中index是根据前序遍历在中序遍历中找到的值
preorder: (ps+1, ps+index-is); (ps+index-is+1, pe)
inorder: (is, index-1); (index+1, ie)
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size()){
return NULL;
}
int len =pre.size();
return Construct(pre, 0 , len -1, vin , 0, len-1);
}
TreeNode* Construct(vector<int> pre, int ps, int pe, vector<int> vin, int vs, int ve){
if(ps > pe) return NULL;
int val = pre[ps];
int index = vs;
while(index <= ve){
if(vin[index] == val) break;
index++;
}
if(index > ve) return NULL;
TreeNode* node = new TreeNode(val);
node->left= Construct(pre,ps+1, ps+index-vs, vin, vs, index-1);
node->right = Construct(pre,ps+index-vs+1, pe, vin, index+1, ve);
return node;
}
};