思路
- 呜呜呜笨蛋把前序遍历和层次遍历搞错了?
- 题目不难,细心即可。
- 根据前序遍历的第一个元素取中序遍历中找将树分成两个部分,不断的递归就好啦,详细的看代码。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int pn=preorder.size();
int n=inorder.size();
TreeNode* root=solve(0,0,n-1,preorder,inorder);
return root;
}
TreeNode* solve(int i,int k,int m,vector<int>&preorder,vector<int>&inorder){
// 中序遍历只有一个元素,那么k==m
if(k==m){
TreeNode*node =new TreeNode(inorder[k],NULL,NULL);
return node;
}
// 不可能只有一个元素
int pos=find(k,m,preorder[i],preorder,inorder);
// 需要根据pos左右是否还有元素决定是否有左右子节点
if(pos!=-1){
// 注意要加上这两个if判断
TreeNode*left=NULL;
if(pos>k){// 还有左节点
left=solve(i+1,k,pos-1,preorder,inorder);
}
TreeNode*right=NULL;
if(pos<m){// 还有右节点
right=solve(i+pos-k+1,pos+1,m,preorder,inorder);
}
TreeNode*root=new TreeNode(preorder[i],left,right);
return root;
}
return NULL;
}
int find(int k,int m,int preorder_,vector<int>&preorder,vector<int>&inorder){
// if(k==m){
// return k;
// }
for(int pos=k;pos<=m;pos++){
if(inorder[pos]==preorder_){
return pos;
}
}
return -1;
}
};