/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
unordered_map<int, int> vin_rd;
public:
TreeNode* reConstructBinaryTree(vector<int>& pre,vector<int>& vin) {
if(pre.size() == 0){
return nullptr;
}
for(int i=0; i<vin.size(); i++){
vin_rd[vin[i]] = i;
}
return create(pre, vin, 0, pre.size()-1, 0, vin.size()-1);
}
TreeNode* create(vector<int>& pre,vector<int>& vin, int a, int b, int c, int d){
if(a > b){
return nullptr;
}
TreeNode* root = new TreeNode(0);
root->val = pre[a];
int index = vin_rd[pre[a]];
root->left = create(pre, vin, a+1, a+index-c, c, index-1);
root->right = create(pre, vin, a+index-c+1, b, index+1, d);
return root;
}
};