目录
105. 从前序与中序遍历序列构造二叉树
34.27% 37.67%
class Solution {
private:
TreeNode *root;
vector<int> preseq,inseq;
TreeNode * dfs(int prel,int prer,int inl,int inr){
if(prel>prer) return NULL;
TreeNode *cur=new TreeNode(preseq[prel]);
int i=inl;
for(;i<=inr;i++){
if(preseq[prel]==inseq[i]) break;
}
int x=i-inl;
cur->left=dfs(prel+1,prel+x,inl,i-1);
cur->right=dfs(prel+x+1,prer,i+1,inr);
return cur;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=preorder.size();
if(n==0) return NULL;
preseq=preorder; inseq=inorder;
root=new TreeNode(preorder[0]);
int i=0;
for(;i<n;i++){
if(preorder[0]==inorder[i])break;
}
root->left=dfs(1,i,0,i-1);
root->right=dfs(i+1,n-1,i+1,n-1);
return root;
}
};
106. 从中序与后序遍历序列构造二叉树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode *root;
vector<int> postseq,inseq;
TreeNode * dfs(int postl,int postr,int inl,int inr){
if(postl>postr) return NULL;
TreeNode *cur=new TreeNode(postseq[postr]);
int i=inl;
for(;i<=inr;i++){
if(postseq[postr]==inseq[i]) break;
}
int x=i-inl;
cur->left=dfs(postl,postl+x-1,inl,i-1);
cur->right=dfs(postl+x,postr-1,i+1,inr);
return cur;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n=inorder.size();
if(n==0) return NULL;
postseq=postorder; inseq=inorder;
root=new TreeNode(postorder[n-1]);
int i=0;
for(;i<n;i++){
if(postorder[n-1]==inorder[i])break;
}
root->left=dfs(0,i-1,0,i-1);
root->right=dfs(i,n-2,i+1,n-1);
return root;
}
};