LeetCode[105]从前序与中序遍历序列构造二叉树

news2024/12/23 5:29:22

难度:中等

题目:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

 示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

 Related Topics

  • 数组
  • 哈希表
  • 分治
  • 二叉树

 重点!!!解题思路

第一步: 

这道题我们使用递归和栈的思想来解决此题

前序遍历:根左右,中序遍历,左右根。

我们能很容易的得到前序遍历的根节点,但是不容易拿到中序遍历根节点的下标

所以我们首先采用map集合来存储中序遍历的节点值

第二步:

使用递归来创建根节点下的每个节点

明白上述思路即可实现此题 

源码+讲解:

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map = new HashMap<>();  //存储inorder的所有节点
        for (int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return helper(preorder,inorder,0,preorder.length-1,0,inorder.length-1);//递归求解
    }
    public TreeNode helper(int[] preorder, int[] inorder,int p_start,int p_end,int i_start,int i_end){  //每次传起始和终末值
        if (p_start>p_end) return null;  //空节点的返回
        TreeNode root = new TreeNode(preorder[p_start]);  //节点创建
        int mid = map.get(preorder[p_start]);//获得根节点
        int leftNum=mid-i_start;//根据中序遍历来得到左子树的长度
        root.left=helper(preorder,inorder,p_start+1,p_start+leftNum,i_start,mid-1);
        root.right=helper(preorder,inorder,p_start+leftNum+1,p_end,mid+1,i_end);
        return root;
    }
}

运行结果:

 

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。 

系列持续更新中,点个订阅吧

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

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

相关文章

Vue基础4

Vue基础4计算属性姓名案例 - 第一种用click.keyup的方法姓名案例 - 第二种用v-model双向绑定的方法姓名案例 - 第三种使用methods方法姓名案例 - 第四种使用计算属性的方法计算属性的简写—只考虑读取&#xff0c;不考虑修改时候使用监视属性第一种普通写法第二种用计算属性的写…

【信号处理】卡尔曼(Kalman)滤波(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java内部类分类

文章目录内部类分类局部内部类的使用匿名内部类成员内部类静态内部类一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员 思考:类的五大成员是哪些? - 属性、方法、构造器、代码块、内…

Windows安装Git教程(2022.11.18 Git2.38.1)

&#xff08;1&#xff09;首先前往Git官网&#xff0c;下载安装文件&#xff1a; &#xff08;2&#xff09;打开安装程序&#xff0c;把Only show new options的勾去掉&#xff0c;点击Next&#xff1a; &#xff08;3&#xff09;此处可以选用默认设置&#xff0c;也可以勾…

ProCAST一键导出有限元模型的几何拓扑和属性信息

第一次将ProCast有限元后处理中的数据导出&#xff0c;当时没有经验&#xff0c;方法比较粗暴&#xff0c;详情见文章&#xff1a;ProCast导出节点应力数据并格式化。 最近发现了一种更高效的数据导出“新姿势”&#xff0c;能够快速得到有限元模型的几何拓扑和节点属性数据&a…

电科大离散数学-2-命题逻辑-2

目录 2.7 范式 2.7.1 范式的定义 2.7.2 范式存在定理 2.8 主析取范式和主合取范式 2.8.1 极小项和极大项的定义和编码 2.8.2 极小项和极大项的性质 2.8.3 主析取范式和主合取范式的定义 2.8.4 主范式求解定理 2.8.5 真值表技术 2.8.6 范式的相互转化 2.8.7 主范式的…

[附源码]Python计算机毕业设计jspm计算机学院党员积分管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Markdown 教程之如何在 Markdown 文档中添加流程图、方程式和交互式图形

您是否遇到过想要在 Markdown 文档中包含一些简单图表或方程式的场景?如果这是一次性的事情,你可以做的是使用 Power Point 或在线生成器,将图表保存为图像并将其放在你的文章中。这种方法的缺点是背景颜色可能与您的文章不匹配,并且进行更改非常耗时。 Markdown 扩展是第…

[附源码]java毕业设计柠檬电动车租赁系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

java selenium (五) 元素定位大全

页面元素定位是自动化中最重要的事情&#xff0c; selenium Webdriver 提供了很多种元素定位的方法。 测试人员应该熟练掌握各种定位方法。 使用最简单&#xff0c;最稳定的定位方法。 自动化测试步骤 在自动化测试过程中&#xff0c; 测试程序通常的操作页面元素步骤 1. 找到…

【快速上手系列】内网穿透(natapp)的快速上手和简单使用教程

【快速上手系列】内网穿透&#xff08;natapp&#xff09;的快速上手和简单使用教程 使用 1、natapp配置 网址 https://natapp.cn/ 官方文档 https://natapp.cn/article/natapp_newbie &#xff08;这个也挺言简意赅的&#x1f60e;&#xff09; 点击下载或向下划到客户端…

读写算杂志社读写算编辑部读写算杂志2022年第30期目录

课程改革 新课程理念下学生自主学习能力培养策略探究 陈璟; 1-3 新课改下初中语文教学中名著阅读教学策略探究 赵璇; 4-6 教育创新《读写算》投稿&#xff1a;cn7kantougao163.com 多媒体辅助下初中物理教学方法改革策略分析 张鹤贵; 7-9 关于互联网环境下小学美术课堂教学模式…

LVGL | 1.LVGL PC模拟器之CodeBlocks

LVGL的学习与使用 LVGL | 1.LVGL PC模拟器之CodeBlocks 1.资源 1-1.主页&#xff1a;https://lvgl.io/ 1-2.LVGL | LVGL简介之中文文档 1-3.LVGL | LVGL快速概述之中文文档 1-4.问题反馈&#xff1a;https://forum.lvgl.io/ 1-5.LVGL开源GUI零基础入门课程(韦东山监制) 教程基…

【附源码】计算机毕业设计JAVA沙县小吃点餐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

通信电源专业技术交流

UPS电源 •UPS为交流不间断供电电源系统的英文缩写。• UPS系统原理&#xff1a;UPS系统由整流模块、逆变器、蓄电池、静态开关等组成。整流模块&#xff08;AC/DC&#xff09;和逆变器&#xff08;DC/AC&#xff09;都为能量变换装置&#xff0c;蓄电池为储能装置。除此还有间…

docker部署Jenkins与任务创建【七千字超详细指南】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录什么是jenkins&#xff1f;jenkins的功能依赖环境使用docker快速搭建查看版本下载jenkins镜像使用d…

搞个网站需要多少钱【网站费用】

想搞一个网站&#xff0c;我们先了解一下搞个网站需要多少钱&#xff1f;网站建设费用主要包括&#xff1a;网站搭建、服务器费用&#xff08;有些是免费的&#xff09;、域名费用以及其他杂费。对于刚成立网站我们可以选择用自助建站方案来进行搭建网站&#xff0c;因为我们自…

【freeRTOS】操作系统之五.-内存管理

\FreeRTOS\Source\portable\MemMang下提供了5中内存分配机制的实现 一、配置FreeRTOS内存大小 在FreeRTOSConfig.h头文件中宏configTOTAL_HEAP_SIZE用于配置内核可用的RAM大小。 在heap1.c, heap2.c, heap4.c源文件中&#xff0c;分配的内存实际上是用一个静态数组ucHeap来表…

阿里后端优化这么恐怖?看完这20W字Java性能实战经验手册,最少P7

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

通过rpm安装MySQL8.0

前文 下载虚拟机&#xff0c;安装Linux&#xff08;Centos7发行版&#xff09;关闭SELinux服务 &#xff08;安全模块&#xff0c;容易跟其他程序冲突&#xff0c;建议关闭&#xff09;替换yum源 &#xff08;加快下载依赖速度&#xff09;安装MySQL 关闭SELinux 进入vi /ec…