【笔记】力扣 106. 从中序与后序遍历序列构造二叉树★
已解答
中等
相关标签
相关企业
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:

输入: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 <= 3000postorder.length == inorder.length-3000 <= inorder[i], postorder[i] <= 3000inorder和postorder都由 不同 的值组成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);
}
};
浙公网安备 33010602011771号