目录

leetcode日记92从前序与中序遍历序列构造二叉树

目录

leetcode日记(92)从前序与中序遍历序列构造二叉树

https://i-blog.csdnimg.cn/direct/a5260e3879984bbcb87227266beaac77.png

想了很久很久,其实思路很简单,应该是在数据结构上讲过的方法。

意思是前序遍历中,正中间一定是第一位,而中序遍历,正中间在中间位置,将左右节点分开。

有了这个思路就好做了。

每次取前序遍历的下一位,在中序遍历上找到这一位,然后左树右树也按照这个方法,如此递归。

这是我最开始写的代码:

/**
 * 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:
    vector<int> preorder;
    int n=0;
    TreeNode* dg(vector<int> inorder){
        TreeNode* r=new TreeNode(preorder[n]);
        if(inorder.size()==1)  return r;
        int middle=preorder[n];
        for(int i=0;i<inorder.size();i++){
            if(middle==inorder[i]){
                if(i!=0){
                    vector<int> left(inorder.begin(),inorder.begin()+i);
                    n++;
                    r->left=dg(left);
                }
                if(i!=inorder.size()-1){
                    vector<int> right(inorder.begin()+i+1,inorder.end());
                    n++;
                    r->right=dg(right);
                }
                break;
            }
        }
        return r;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        this->preorder=preorder;
        return dg(inorder);
    }
};

看了答案发现优化方法:在开始前建立哈希表,将每个中序遍历节点和其位置记录下来,这样在后面递归的时候就可以不用每次都要遍历一遍中序遍历了。这是一个很好的优化思路。

/**
 * 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:
    vector<int> preorder;
    unordered_map<int,int> index;
    int n=0;
    TreeNode* dg(int min,int max){
        if(min>max||preorder.size()<=n) return NULL;
        TreeNode* r=new TreeNode(preorder[n]);
        int i=index[preorder[n]];
        if(i!=min){
            n++;
            r->left=dg(min,i-1);
        }
        if(i!=max){
            n++;
            r->right=dg(i+1,max);
        }
        return r;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        this->preorder=preorder;
        for(int i=0;i<inorder.size();i++){
            index[inorder[i]]=i;
        }
        return dg(0,inorder.size()-1);
    }
};