[Leetcode 105][Medium] 从前序与中序遍历序列构造二叉树-递归

news2024/9/20 1:07:08

目录

一、题目描述

二、整体思路

三、代码


一、题目描述

题目地址

二、整体思路

        前序遍历得到的是[根结点|左子树|右子树],中序遍历得到的是[左子树|根结点|右子树]

那么可以设立一个递归函数,作用是利用前序遍历的数组和中序遍历的数组构建一个节点的二叉树

        参数为(前序遍历数组、中序遍历数组、前序遍历数组的左边界、前序遍历数组的右边界、中序遍历数组的左边界、中序遍历数组的右边界)

        问题的关键是要找到根节点,每一次调用递归函数时,前序遍历数组的左边界为根节点的索引,然后我们要设法找到根节点在中序遍历数组的索引。因此,一开始可以先用哈希表保存根节点在中序遍历数组的索引。

        根节点在Preorder中索引永远为l1,在Inorder索引i可以通过哈希表得到

        Inorder中[l2,i-1]的元素就是左子树的元素,在Preorder中表现为[l1+1,l1+i-l2]

        同理,Inorder中[i+1,r2]的元素就是右子树的元素,在Preorder中表现为[l1+i-l2+1,r1](l1+i-l2为左子树元素,+1就是右子树第一个元素)

        综上,Preorder中根节点索引为l1,左子树元素区间为[l1+1,l1+i-l2],右子树区间为[l1+i-l2+1,r1]

Inorder中根节点索引为i,左子树元素区间为[l2,i-1],右子树区间为[i+1,r2]

三、代码

/**
 * 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> map=new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==1 && inorder.length==1){
            return new TreeNode(preorder[0]);
        }
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        TreeNode root=build(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
        return root;
    }
    public TreeNode build(int[] preorder,int[] inorder,int l1,int r1,int l2,int r2){
        if(l1>r1 || l2>r2){
            return null;
        }
        TreeNode node=new TreeNode(preorder[l1]);
        int newl1=map.get(preorder[l1]);
        node.left=build(preorder,inorder,l1+1,l1+newl1-l2,l2,newl1-1);
        node.right=build(preorder,inorder,l1+newl1-l2+1,r1,newl1+1,r2);
        return node;
    }
}

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

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

相关文章

汇川技术|Inoproshop软件菜单[在线、调试]

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 现如今学习资源是容易获取了&#xff0c;像我网盘里堆了7T的资料&#xff0c;有很多还没看过&#xff0c;总是见到了就收藏起来&#xff0c;但是真的看不过来啊。有时间和精力的小伙伴可以找自己感兴趣的看起来。 本…

景商场双目客流量摄像机,具有100°宽视角,识别范围广

在当今竞争激烈的商业环境中&#xff0c;商场管理者们一直在寻求更有效的方法来了解顾客行为、优化运营策略。商场双目客流量摄像机的出现&#xff0c;为商场管理带来了新的机遇。 一、功能强大 商场双目客流量摄像机具有多项强大功能。首先&#xff0c;它拥有 100 宽视角&…

雷达水文监测站

雷达水文监测站是一种利用雷达技术进行水文监测的设备&#xff0c;其功能主要包括以下几个方面&#xff1a; 水位监测&#xff1a;雷达水文监测站可以实时监测水体的水位变化&#xff0c;通过测量水面到雷达发射器的距离来计算水位。 流量监测&#xff1a;根据水位的变化&…

西门子一个PLC两个HMI分别显示不同报警内容

当前项目为一个PLC带两个HMI&#xff0c;功能上两个站完全分离&#xff0c;但是为了避免重复绘制HMI&#xff0c;先将两个站点报警链接到同一个HMI上&#xff0c;同时又需要指定站点的HMI单独显示该站点的报警&#xff1b;否则会出现如下情况&#xff0c;两个站都显示全部的报警…

传输大咖33 | 适合企业内外网文件交换系统是怎样的?

企业的内外网文件交换是企业日常运营的重要环节。然而&#xff0c;随着技术的发展&#xff0c;企业的文件数据量日益增长&#xff0c;文件的格式也越来越复杂多样。传统的内外网文件交换方式也逐渐显露出不足之处&#xff0c;对于企业来说&#xff0c;寻求更加高效、安全、可靠…

YOLOv9改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

Word文件密码忘记,该如何才能编辑Word文件呢?

Word文件打开之后&#xff0c;发现编辑功能都是灰色的&#xff0c;无法使用&#xff0c;无法编辑&#xff0c;遇到这种情况&#xff0c;是因为Word文件设置了限制编辑导致的。一般情况下&#xff0c;我们只需要输入Word密码&#xff0c;将限制编辑取消就可以正常编辑文件了&…

LLM大模型:生成式人工智能完全指南,240页pdf

《你最后一本需要的AI书籍。我们保证&#xff01;》 AI技术发展如此迅速&#xff0c;这本书可能已经过时了&#xff01;但别担心——《生成性AI完全过时指南》依然是任何想将生成性AI从玩具变成工具的人必读的书籍。无论未来如何变化&#xff0c;它都能教你如何充分利用AI。你…

FL Studio24.1.1.4239中文高级版破解补丁+永久免费激活码许可证

FL Studio 24.1.1.4239中文版&#xff0c;音乐制作人的“瑞士军刀” 在音乐制作的世界中&#xff0c;有一款软件被誉为“瑞士军刀”&#xff0c;那就是FL Studio 24.1.1.4239中文版。它不仅功能强大&#xff0c;而且界面友好&#xff0c;让音乐制作变得简单又有趣。今天&#…

大模型如何赚钱,杀手级应用是什么、创业机会在哪里?

除了通义大模型外&#xff0c;MiniMax、月之暗面、智谱AI、猎户星空、零一万物、百川智能六家大模型厂商已经与钉钉达成合作。目前&#xff0c;钉钉生态伙伴总数超过5600家&#xff0c;其中AI 生态伙伴已经超过100家&#xff1b;钉钉AI每天调用量超1000万次。 在下午的圆桌对话…

八种dll文件丢失怎么恢复的步骤分享,超全面介绍dll文件几解决方法

在使用Windows操作系统的过程中&#xff0c;我们时常会遇到程序运行错误提示&#xff0c;其中“DLL文件丢失”是一类非常典型的问题。这类错误不仅令人困扰&#xff0c;还可能阻碍软件或系统功能的正常使用。动态链接库&#xff08;DLL&#xff09;文件是Windows系统中的一个关…

LeetCode 精选 75 回顾

目录 一、数组 / 字符串 1.交替合并字符串 &#xff08;简单&#xff09; 2.字符串的最大公因子 &#xff08;简单&#xff09; 3.拥有最多糖果的孩子&#xff08;简单&#xff09; 4.种花问题&#xff08;简单&#xff09; 5.反转字符串中的元音字母&#xff08;简单&a…

基于大语言模型的医疗问答系统的设计与研究

目录 研究背景及意义 国内外研究现状 研究内容 研究方案与技术路线 大语言模型的基本原理 大语言模型的部署 大语言模型微调 大语言模型提示工程&#xff08;Prompt&#xff09; 大语言模型RAG技术 LangChain 多模态大语言模型 研究背景及意义 大语言模型&#xff0…

网络安全售前入门03——审计类产品了解

目录 1.前言 2.堡垒机介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 3.日志审计 3.1产品架构功能 3.2应用场景 3.3部署形式 3.4产品价值 3.5选型依据 后续 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统…

CSS文本样式(一)

一、font-family 1、font-family属性 font-family​ &#xff1a;属性指定元素的​字体​&#xff0c;语法格式如下&#xff1a; ​font-family​: 字体1,字体2,...; 有两种字体系列名称&#xff1a; ​字体系列​&#xff1a;特定的字体系列&#xff08;如Times New Rom…

Mac上免费使用Typora保姆级教程 简单 2024可用

一、官网安装正版软件 Typora官网--点击进入Typora官网下载正版软件 二、找到软件文件 进入访达&#xff0c;commandshiftG打开路径搜索&#xff0c;输入 /Applications/Typora.app/Contents/Resources/TypeMark 进入Typora文件夹 打开这个文件 三、修改字段 然后搜索字段…

Ubuntu2004编译VLC-QT(记录)(根据官方步骤来)

来到VLC-QT的github官方地址--VLC-QT&#xff08;点击前面的&#xff09; 下载官方源码&#xff0c;也可以git clone拉取 2&#xff1a;解压源码之后&#xff0c;进入文件夹 创建文件夹“build”用于存放待会编译产生的相关文件&#xff0c;执行 mkdir buildcd build 回到VLC…

【Redis】Redis 持久化 -- RDB AOF

文章目录 1 持久化介绍2 RDB2.1 RDB 介绍2.2 触发方式2.3 流程介绍2.4 RDB 文件2.5 RDB 优缺点 3 AOF3.1 AOF 介绍3.2 缓冲区刷新策略3.3 AOF 重写机制3.3.1 重写机制介绍3.3.2 混合持久化3.3.3 重写触发方式3.3.4 AOF 重写流程 3.4 AOF 优缺点 4 启动时数据恢复 1 持久化介绍 …

OceanBase V4 技术解读:从Alter Table 看DDL的支持

背景 数据库类型可以划分为两大类&#xff1a;关系型数据库和非关系型数据库。而关系型数据库以表格形式进行数据组织&#xff0c;同时遵循表关系的约束&#xff0c;例如创建一张表&#xff0c;表里面包含多个列&#xff0c;不同的列可以有不同的类型。当需要改表结构&#xf…

什么是数据库 DevOps?

在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 IT 界人士提出了这样的担忧&#xff1a;两个行业的分离&#xff0c;即编…