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

简介: 从中序与后序遍历序列构造二叉树

一、题目描述:

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

img

示例 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 <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

后序遍历:先遍历左子树,再遍历右子树和根结点。

用画图解决该问题。

从中序与后序遍历序列构造二叉树:先在后序遍历序列中找到根结点,再在中序遍历序列中根据根结点划分左右子树的中序遍历序列,也在后序遍历序列中根据根结点划分左右子树的前序遍历序列,递归此步骤即可。

当在后序遍历序列中的pr位置处找到根结点,则根结点在中序遍历序列中的位置为k:

左子树的中序遍历序列为 [il, k - 1] ,右子树的中序遍历序列为 [k + 1, ir] 。

左子树的后序遍历序列为 [pl, pl + k - 1 - il] ,右子树的前序遍历序列为 [pl + k - 1 - il + 1, pr - 1] 。

三、AC 代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer, Integer> hm = new HashMap<>();

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        for (int i = 0; i < inorder.length; ++i) {
            hm.put(inorder[i], i);
        }
        return dfs(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
    }

    TreeNode dfs(int[] in, int il, int ir, int[] post, int pl, int pr) {
        if (il > ir) {
            return null;
        }
        int k = hm.get(post[pr]);
        TreeNode node = new TreeNode(post[pr]);
        node.left = dfs(in, il, k - 1, post, pl, pl + k - 1 - il);
        node.right = dfs(in, k + 1, ir, post, pl + k - il, pr - 1);
        return node;
    }
}
AI 代码解读

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!

目录
打赏
0
0
0
1
4
分享
相关文章
从中序与后序遍历序列构造二叉树
【10月更文挑战第13天】这段内容介绍了一种基于中序和后序遍历序列构建二叉树的方法。通过识别后序遍历中的根节点,并利用中序遍历划分左右子树,进而递归构建整棵树。文中提供了具体示例及Python代码实现,并分析了该方法的时间与空间复杂度。
158 0
Linux普通用户设置root用户密码——sudo命令报错解决方法
Linux普通用户设置root用户密码——sudo命令报错解决方法
1602 0
Linux普通用户设置root用户密码——sudo命令报错解决方法
2024高频前端面试题合集(一)
JavaScript Bridge 是一种在 JavaScript 和其他语言(如 Java、Objective-C 等)间建立通信的技术,常用于混合应用开发,允许调用原生功能、获取数据、事件通知及优化性能。SSR(服务器端渲染)的单机 QPS 取决于服务器性能、应用复杂度、网络条件等因素。Egg.js 是基于 Node.js 的企业级框架,通过目录结构约定、启动流程、插件机制和核心组件来初始化应用。前端错误捕获可通过 try-catch、window.onerror、Promise.catch 和 unhandledrejection 事件等方式实现。
158 1
mPaaS小程序技术架构深度解析
mPaaS 小程序框架作为一款 App 通用框架,帮助开发者面向自身的 App 实现小程序投放。不止如此,小程序代码仅需撰写一次,便可多端投放至自有 App、支付宝、钉钉甚至其他小程序开放平台。
mPaaS小程序技术架构深度解析
web前端 第一阶段面试题(1),2024年最新拼多多前端社招面试
web前端 第一阶段面试题(1),2024年最新拼多多前端社招面试
iOS应用内弹窗通知怎么实现?其实很简单,这样,这样,再这样.....你学会了么?
iOS应用内弹窗通知怎么实现?其实很简单,这样,这样,再这样.....你学会了么?
346 0
做了5年iOS,靠着这份面试题跟答案,我从12K变成了30K
在博主认为,对于iOS面试以及进阶的最佳学习方法莫过于刷题+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现面试并不难,其次就是在刷题的过程中有没有去思考,刷题只是次之,这又是一个层次了,这里暂时不提后面再谈。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等