【笔记】力扣 106. 从中序与后序遍历序列构造二叉树★

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

已解答

中等

相关标签

相关企业

给定两个整数数组 inorderpostorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树

示例 1:

img

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorderpostorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

题解

/**
 * 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:
    std::unordered_map<int, int> inorderMap;
    int postIndex;

    TreeNode* helper(std::vector<int>& inorder, std::vector<int>& postorder, int inStart, int inEnd) {
        if (inStart > inEnd) return nullptr;
        // 获取当前根节点的值
        int rootVal = postorder[postIndex];
        // 立即更新 postIndex
        postIndex--;
        TreeNode* node = new TreeNode(rootVal);
        int inIndex = inorderMap[rootVal];

        // 注意这里先构建右子树,再构建左子树
        node->right = helper(inorder, postorder, inIndex + 1, inEnd);
        node->left = helper(inorder, postorder, inStart, inIndex - 1);

        return node;
    }

    TreeNode* buildTree(std::vector<int>& inorder, std::vector<int>& postorder) {
        int n = inorder.size();
        for (int i = 0; i < n; i++) {
            inorderMap[inorder[i]] = i;
        }
        postIndex = n - 1;
        return helper(inorder, postorder, 0, n - 1);
    }
};
posted @ 2025-03-24 23:41  ToFuture$  阅读(14)  评论(0)    收藏  举报