哈希表+迭代
以前序确定节点,以中序确定节点左右子节点
class Solution {
public:
int n=0;
unordered_map<int,int>hashmap;
TreeNode* dsf(vector<int>& preorder, vector<int>& inorder,int pre_l,int pre_r,int in_l,int in_r){
cout<<pre_l<<" "<<pre_r<<" "<<in_l<<" "<<in_r<<endl;
if(pre_r<pre_l)return NULL;
TreeNode* tree=new TreeNode(preorder[pre_l]);
if(in_l==in_r)return tree;
int in_innode=hashmap[preorder[pre_l]];
int size_l=in_innode-in_l;
int size_r=in_r-in_innode;
tree->left=dsf(preorder,inorder ,pre_l+1,pre_l+size_l, in_l,in_innode-1);
tree->right=dsf(preorder,inorder ,pre_r-size_r+1,pre_r, in_innode+1,in_r);
return tree;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty())return NULL;
n=preorder.size();
for(int i=0;i<n;i++)hashmap[inorder[i]]=i;
return dsf(preorder,inorder,0,n-1,0,n-1);
}
};