// 解法一:
class Solution {
public:
unordered_map<int,int> mp;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()) return nullptr;
// 利用哈希表加速中序遍历结果中根的查找
int sz=preorder.size()-1;
for(int i=0;i<sz+1;i++){
mp[inorder[i]]=i;
}
return dfsBuild(preorder,0,sz,inorder,0,sz);
}
TreeNode* dfsBuild(vector<int>& preorder,int ps,int pe,vector<int>& inorder,int is,int ie){
if(ps>pe) return nullptr;
int root_val=preorder[ps];
TreeNode* root=new TreeNode(root_val);
int root_index_in_inorder=mp[root_val];
int cnt_left=root_index_in_inorder-is;
root->left=dfsBuild(preorder,ps+1,ps+cnt_left,inorder,is,root_index_in_inorder-1);
root->right=dfsBuild(preorder,ps+cnt_left+1,pe,inorder,root_index_in_inorder+1,ie);
return root;
}
};