【LeetCode 面试经典150题】106. Construct Binary Tree from Inorder and Postorder Traversal 中后序遍历构造二叉树

本文介绍了解决LeetCode问题106的方法,通过中序遍历和后序遍历数组,利用哈希映射和递归策略,构建出给定的二叉树结构。
摘要由CSDN通过智能技术生成

106. Construct Binary Tree from Inorder and Postorder Traversal

题目大意

Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree.

中文释义

给定两个整数数组 inorderpostorder,其中 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]

限制条件

  • inorder 的长度范围为 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorderpostorder 包含唯一值。
  • postorder 中的每个值也出现在 inorder 中。
  • inorder 保证是树的中序遍历。
  • postorder 保证是树的后序遍历。

解题思路

方法

这是针对“106. Construct Binary Tree from Inorder and Postorder Traversal”问题的解决方案。该方法通过结合中序遍历和后序遍历的数组,构造出原始的二叉树。

  1. 存储遍历结果

    • 使用两个向量 in_orderpost_order 来存储中序遍历和后序遍历的结果。
  2. 创建哈希映射

    • 使用一个哈希表 in_map 来存储中序遍历中每个值对应的索引,以便快速定位根节点在中序遍历中的位置。
  3. 递归构建树

    • 实现 buildTree 函数,使用后序遍历的最后一个元素作为根节点。
    • 在中序遍历中找到根节点,确定左右子树的边界。
    • 递归构建左子树和右子树。
  4. 构建整棵树

    • buildTree 的另一个重载中,初始化 in_orderpost_orderin_map,然后调用第一个 buildTree 函数开始递归。

代码

class Solution {
public:
    vector<int> in_order, post_order;
    unordered_map<int, int> in_map;
    TreeNode* buildTree(int pStart, int pEnd, int iStart, int iEnd) {
        if (pStart > pEnd || iStart > iEnd) return nullptr;
        TreeNode* root = new TreeNode(post_order[pEnd]);
        int inRoot = in_map[root -> val];
        int numsleft = inRoot - iStart;
        root -> left = buildTree(pStart, pStart + numsleft - 1, iStart, inRoot - 1);
        root -> right = buildTree(pStart + numsleft, pEnd - 1, inRoot + 1, iEnd);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        in_order = inorder;
        post_order = postorder;
        for (int i = 0; i < inorder.size(); i++) {in_map[inorder[i]] = i;}
        return buildTree(0, post_order.size() - 1, 0, inorder.size() - 1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值