Leetcode_tree从前序/后序遍历+中序遍历构造二叉树105+106

目录

105. 从前序与中序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树


 

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;
    }
};
发布了88 篇原创文章 · 获赞 77 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43107805/article/details/105333790