LeetCode HOT100 - 从前序与中序遍历序列构造二叉树

首先思路实际上是比较简单的

可以注意到前序遍历的第一个节点一定是根节点,再去中序遍历中找到这个节点,进而分成两部分,左边的是对应于左子树,右边的对应于右子树,然后递归完成,前序遍历的左子树和右子树对应的部分可以通过中序遍历区间的大小来得到

关键是后面的实现

就是每次不要真的切割 vector,否则每次递归都要复制数组,比较麻烦且效率低,比较合适的方法是直接去用下标区间表示当前子树在 preorder 和 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:
    unordered_map<int, int> pos;
    TreeNode* buildTree(vector<int>& a, vector<int>& b) {
        int n = a.size();
        for (int i = 0; i < n; i++) {
            pos[b[i]] = i;
        }
        auto dfs = [&](this auto&& self, int prel, int prer, int inl, int inr) -> TreeNode* {
            if (prel > prer) {
                return nullptr;
            }
            TreeNode* root = new TreeNode(a[prel]);
            int k = pos[a[prel]];
            int lsize = k - inl;
            root->left = self(prel + 1, prel + lsize, inl, k - 1);
            root->right = self(prel + lsize + 1, prer, k + 1, inr);
            return root;
        };
        return dfs(0, n - 1, 0, n - 1);
    }
};
posted @ 2026-05-05 23:32  rdcamelot  阅读(12)  评论(0)    收藏  举报