leecode106——使用中序遍历和后序遍历构造一棵二叉树

news2024/9/22 13:37:05

leecode106 中序遍历和后序遍历构造一棵二叉树

🔎中序遍历和后续遍历的性质

在后序遍历中,最后一个元素二叉树的根节点

在中序遍历序列中,根节点的左边为左子树,右边为右子树

🔎1.二叉树的还原过程描述

1.首先,在后续遍历中找到最后一个元素为根节点
2.根据后续遍历找到中序遍历的根节点位置
3.根据根节点的位置将中序遍历序列分为左子树和右子树
4.根据根节点的位置确定左子树和右子树在中序遍历和后序遍历的位置
5.递归构造左子树和右子树
6.返回根节点结束。

🔎2.二叉树的还原过程变量定义

需要定义以下变量对树进行还原。
1.使用HashMap保存中序遍历的元素和索之间的位置关系。因为在后序遍历找到根节点之后,需要在中序遍历中根据根节点将树划分为左子树和右子树。
2.ri为根节点在中序遍历中的位置
3.中序遍历数组的两个标记位置[is,ie],分别表示起始位置和结束位置
4.后续遍历数组的两个标记位置[ps,pe],分别表示起始位置和结束位置。

🔎3.位置关系的计算

在找到根节点以后,需要确定下一轮中,左子树和右子树在中序遍历数组和后序遍历数组的左右边界位置。
左子树-中序数组 is = is, ie = ri - 1
左子树-后序数组 ps = ps, pe = ps + ri - is - 1 (pe计算过程解释,后续数组的起始位置加上左子树长度-1 就是后后序数组结束位置了,左子树的长度 = 根节点索引-左子树)
右子树-中序数组 is = ri + 1, ie = ie
右子树-后序数组 ps = ps + ri - is, pe - 1

在这里插入图片描述
在这里插入图片描述

📖补充:

📒1.怎么利用中序遍历中根节点的位置ri来确定后序遍历中确定左子树的范围?

在中序遍历中,根节点的位置 ri 表示根节点在中序遍历结果数组中的索引位置。由于后序遍历的特性,根节点总是位于后序遍历结果数组的最后一个位置。
要确定左子树在后序遍历结果数组中的范围,我们需要考虑以下几点
(1)左子树节点在后序遍历结果数组中的相对顺序与中序遍历结果数组中的相对顺序是一致的。也就是说,左子树节点在后序遍历结果数组中出现在根节点之前。
(2)左子树在中序遍历结果数组中的节点个数可以通过 ri - is 来计算,其中 ri 是根节点的位置,is 是当前子树在中序遍历结果数组中的起始位置。
(3)根据左子树在中序遍历结果数组中的节点个数,我们可以推断出左子树在后序遍历结果数组中的范围。左子树在后序遍历结果数组中的起始位置为 ps,即当前子树在后序遍历结果数组中的起始位置。左子树在后序遍历结果数组中的结束位置为 ps + ri - is - 1,即左子树的节点个数减1加上起始位置。

📒2.中序遍历和后序遍历的性质?

(1)中序遍历:左子树的节点总在根节点的左侧,右子树的节点总在根节点的右侧
(2)后序遍历:根节点总是在最后一个位置,而左子树的节点总是出现在右子树之前。
(3)假设我们已经知道左子树在中序遍历结果数组中的节点个数为leftcount,而后序遍历结果数组范围为[ps,pe],ps为起始索引,pe为结束索引。
(4)根据后序遍历的特点,根节点总是在最后一个位置,即post[pe]是根节点的值。中序遍历的根节点为memo.get(root)
(5)那我们可以得到以下关系:

a:左子树在后序遍历结果数组中的节点个数为 leftCount,因此右子树在后序遍历结果数组中的节点个数为 pe - ps - leftCount。
b:左子树在中序遍历结果数组中的范围为 [is, ri - 1],其中 is 是左子树在中序遍历结果数组中的起始索引,ri - 1 是左子树在中序遍历结果数组中的结束索引。左子树在后序遍历结果数组中的范围为 [ps, ps + leftCount - 1]。
c:右子树在中序遍历结果数组中的范围为 [ri + 1, ie],其中 ri + 1 是右子树在中序遍历结果数组中的起始索引,ie 是右子树在中序遍历结果数组中的结束索引。
d:右子树在后序遍历结果数组中的范围为 [ps + leftCount, pe - 1]

3.为什么使用HashMap?

HashMap是一种常用的数据结构,用于存储键值对。在算法和编程中,使用HashMap可以提供高效的数据查找和检索操作。
在给定的代码示例中,使用HashMap的目的是为了快速查找中序遍历中每个节点的位置。这样做是为了在后序遍历中找到当前子树的根节点的位置,进而划分出左子树和右子树的范围。HashMap的键表示节点的值,值表示节点在中序遍历数组中的索引位置。通过构建这个HashMap,在查找根节点的位置时,可以在常数时间内找到对应的索引。
使用HashMap的好处是可以在常数时间内进行查找操作,因此可以提高程序的运行效率。它可以用于解决需要频繁查找、索引或映射的问题,例如查找元素、统计元素出现次数、快速访问数据等。

代码如下:

class Solution {

    HashMap<Integer,Integer> memo = new HashMap<>();
    int[] post;

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

    public TreeNode buildTree(int is, int ie, int ps, int pe) {
        if(ie < is || pe < ps) return null;

        int root = post[pe];
        int ri = memo.get(root);

        TreeNode node = new TreeNode(root);
        node.left = buildTree(is, ri - 1, ps, ps + ri - is - 1);
        node.right = buildTree(ri + 1, ie, ps + ri - is, pe - 1);
        return node;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP协议基本格式

HTTP协议基本格式 TCP/IP的分层管理HTTP的基本格式 TCP/IP的分层管理 TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为5层&#xff1a; 应用层、传输层、网络层、数据链路层、物理层。 TCP/IP层次化的好处。 如果互联网只由一个协议统筹&#xff0c;某个地方需…

不动点定理的及其有趣应用

最近读高观点下的数学这本书&#xff0c;对书中介绍的布劳威尔不动点定理的有趣性质印象很深&#xff0c;原因是这个定理的某些性质能够解释我们生活中的一些常见现象&#xff0c;这里结合一个例题&#xff0c;聊以记录。 从一个数学题讲起&#xff1a; f(x)是定义在[0,1]上的…

IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP

编辑&#xff1a;ll IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP 型号&#xff1a;IPB60R099CP 品牌&#xff1a;英飞凌 封装&#xff1a;TO-263 最大漏源电流&#xff1a;31A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;99mΩ …

【MySQL】MySQL百万数据深度分页优化思路分析

文章目录 一、业务背景二、瓶颈再现三、问题分析回表覆盖索引IOLIMTI 2000,10 &#xff1f; 四、问题总结五、解决方案优化前后性能对比 一、业务背景 一般在项目开发中会有很多的统计数据需要进行上报分析&#xff0c;一般在分析过后会在后台展示出来给运营和产品进行分页查看…

软考A计划-真题-分类精讲汇总-第十五章(数据库设计)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

如何做到乡村振兴?主要包括以下几点

乡村振兴是现代化发展的常记口号&#xff0c;也是中国整体经济发展的必备条件&#xff0c;乡村振兴是一个多元化的问题&#xff0c;其中包含人文、经济、文化、生态、人才等&#xff0c;那么如何做到乡村振兴呢&#xff1f; 主要包括以下几点&#xff1a; 1.合理利用土地资源…

SpringBoot配置文件敏感信息加密(四十六)

新的生活会开始&#xff0c;直到完成自己的目标. 一. 配置文件敏感信息加密 我们以前在编写 application.yml 文件时&#xff0c;服务器的ip, 数据库的配置&#xff0c;Redis的密码配置等都是明文&#xff0c;这是很不安全的。 我们可以通过 jasypt-spring-boot-starter 插件进…

Python学习26:个人所得税计算器

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 2018年10月1日以前&#xff…

Java 性能调优全攻略:步骤、工具、技巧一网打尽

Java性能调优是一项非常重要的工作&#xff0c;它可以提高应用程序的性能和可伸缩性&#xff0c;并确保应用程序在高负载情况下仍然能够快速、稳定地运行。 1、Java性能调优步骤 Java性能调优的主要步骤包括&#xff1a; 确定目标&#xff1a;首先需要明确性能调优的目标&…

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

在企业级应用中&#xff0c;数据的安全性和隐私保护是极其重要的。Spark 作为数栈底层计算引擎之一&#xff0c;必须确保数据只能被授权的人员访问&#xff0c;避免出现数据泄露和滥用的情况。为了实现Spark SQL 对数据的精细化管理及提高数据的安全性和可控性&#xff0c;数栈…

多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多变量时间序列预测预测结果基本介绍模型特点程序设计学习总结参考资料 预测结果 基本介绍 多维时序 | MATLAB实现CN…

C++进阶——红黑树

C进阶——红黑树 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩 倍&…

五分钟读完一本书 --《小王子》

所有的大人都曾经是小孩。 它是写给大人的童话。是一本用最简单纯净的文字&#xff0c;却将爱与羁绊描写得及其深刻的书。 看东西只有用心才能看得清楚&#xff0c;重要的东西用眼睛是看不见的。 这是踏遍7个星球之后 小王子才明白的道理。 小王子的B612星球小到只有一栋房子那…

小程序容器助力智能移动门户统一

智能移动统一门户遵循“统一规划&#xff0c;统一标准&#xff0c;统一建设&#xff0c;统一运维”的指导思想。它灵活运用前端展示平台&#xff0c;微服务后端平台&#xff0c;流程引擎&#xff0c;规则引擎&#xff0c;非结构化数据平台&#xff0c;即时通讯平台&#xff0c;…

Matlab论文插图绘制模板第92期—折线图(Plot)

之前有分享过Matlab折线图的绘制模板&#xff1a; 但随着技术力的提升&#xff0c;发现很多地方还有待改进&#xff0c;于是便有了本期内容。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…

电子企业应如何规划数字化工厂管理系统

随着科技的不断进步和市场竞争加剧&#xff0c;越来越多的电子企业开始意识到数字化工厂的重要性。数字化工厂管理系统是利用信息技术和自动化技术&#xff0c;对生产全过程进行数字化、智能化和自动化的工厂。它将生产过程中的各个环节进行有机整合&#xff0c;从而提高生产效…

解析DDR设计中容性负载补偿的作用

高速先生成员--孙小兵 我们先来了解一下容性负载和感性负载对链路阻抗的影响。仿真链路模型如下图所示。链路中有三段50Ω的理想传输线&#xff0c;第一段和第二段之间增加一个电容模拟容性负载&#xff0c;第二段和第三段之间增加一个电感模拟感性负载&#xff0c;链路末端是一…

MySQL数据库——MySQL字符集和校对规则详解

在讲解字符集和校对规则之前&#xff0c;我们先来简单了解一下字符、字符集和字符编码。 字符&#xff08;Character&#xff09;是计算机中字母、数字、符号的统称&#xff0c;一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。 计算机是以二进制…

HTML处理控件Aspose.Html 功能演示:将 URL 转换为 PDF

Aspose.Html for .NET 是一种高级的HTML操作API&#xff0c;可让您直接在.NET应用程序中执行广泛的HTML操作任务&#xff0c;Aspose.Html for .NET允许创建&#xff0c;加载&#xff0c;编辑或转换&#xff08;X&#xff09;HTML文档&#xff0c;而无需额外的软件或工具。API还…

如何通过SOLIDWORKS driveworksxpress初步实现参数化设计

当提到参数化设计&#xff0c;我们首先需要了解究竟什么是参数化设计&#xff0c;它是指从一个系统的角度&#xff0c;计划所有的设计过程&#xff0c;在整个系统中建立组件、次组件和子零件之间的关系&#xff0c;在最上层的部分建立设计意图&#xff0c;并将其往较下层的部分…