剑指 Offer 07. 重建二叉树

题目

剑指 Offer 07. 重建二叉树

解析

  1. 确定中序遍历中头节点位置index
  2. 计算左子树长度size = index - inlinl为中序遍历的起点
  3. 构建左子树
    1. 前序遍历位置:[prel + 1, prel + size]
    2. 中序遍历位置:[inl, index - 1]
  4. 构建右子树
    1. 前序遍历位置:[prel + size + 1, prer]
    2. 中序遍历位置:[index + 1, inr]

代码

class Solution {
public:
    unordered_map<int, int> pos;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        for (int i = 0; i < n; i++) {
            pos[inorder[i]] = i;
        }
        return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
    }

    TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int prel, int prer, int inl, int inr) {
        if(prel > prer)
            return NULL;
        //获取中序遍历根节点位置
        int index = pos[preorder[prel]];
        //计算左子树长度
        int size = index - inl;
        TreeNode* root = new TreeNode(preorder[prel]);
        root->left = dfs(preorder, inorder, prel + 1, prel + size, inl, index - 1);
        root->right = dfs(preorder, inorder, prel + size + 1, prer, index + 1, inr);
        return root;
    }
};
posted @ 2022-04-17 20:56  当惜  阅读(16)  评论(0)    收藏  举报