方法一:递归
- 前/后/层序遍历序列找到根结点,然后按此根结点在中序遍历序列中划分左右子树,递归执行即可
class Solution {
unordered_map<int,int>idx;
public:
TreeNode* build(vector<int>&pre,vector<int>&in,int preL,int preR,int inL,int inR){
if(preL>preR)return NULL;
TreeNode *root=new TreeNode(pre[preL]);
int k=idx[pre[preL]],num=k-inL;
root->left=build(pre,in,preL+1,preL+num,inL,k-1);
root->right=build(pre,in,preL+num+1,preR,k+1,inR);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=inorder.size();
for(int i=0;i<n;i++)idx[inorder[i]]=i;
return build(preorder,inorder,0,n-1,0,n-1);
}
};