当前位置: 首页 > news >正文

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

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

提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder 和 postorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder 中
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

思路:后序遍历是左右根,左右无法确定,只有根是一个节点,是能确定的,必然在后续数组的最右边。然后中序遍历是左右根,当根确定之后,虽然左右子树的具体情况不知道,但是知道左右子树的大体,然后把左右子树,继续当作一个树,继续遍历,知道最后一个节点不再是树,向上放回,递归构造。

/*** 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 {public TreeNode buildTree(int[] inorder, int[] postorder) {// 中序遍历是左中右,后序遍历是左右中,使用递归,用左右坐标来分割两个数组,每个小数组都是一个小树// 左右中,这是后序树的数组,那么这个子数组的最后一个元素一定是这个子树的根节点,然后中序序列里找// 左中右,找到中,就可以分割开左右子树,迭代分割,直到最小子树,无法分割return buildTreeHelper(inorder, 0, inorder.length-1, postorder, 0, postorder.length-1);}public TreeNode buildTreeHelper(int[] inorder, int inStart, int inEnd,int[] postorder, int postStart, int postEnd) {if (inStart > inEnd || postStart > postEnd) {return null;}// 最后一个必是根节点int root = postorder[postEnd];int rootIndex = 0;// 得到根节点坐标while (true) {if (root == inorder[rootIndex]) {break;}rootIndex++;}// 只有中序遍历知道左右子树的信息是不够的,还需要让后续遍历知道int leftLength = rootIndex - inStart;// 左子树的中序遍历数组起始就是父数组的起始,结束是根节点-1,后序遍历数组的起始就是父数组的起始,结束是父数组起始 + 左子树长度 - 1TreeNode left = buildTreeHelper(inorder, inStart, rootIndex-1, postorder, postStart, postStart + leftLength-1);// 右子树的中序遍历数组起始就是根节点+1,结束是父数组的结束,后序遍历数组的起始就是父数组的起始 + 左子树长度,结束是父数组的结束 - 1,减去的这个1就是根节点的长度TreeNode right = buildTreeHelper(inorder, rootIndex + 1, inEnd, postorder, postStart + leftLength, postEnd-1);// 然后构造返回return new TreeNode(root, left, right);}}

相关文章:

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

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3…...

针对考研的C语言学习(定制化快速掌握重点1)

1.printf函数的几个要点 printf函数中所有的输出都是右对齐的&#xff0c;除非在%后面添加负号&#xff0c;则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…...

【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)

1. 数据库(DataBase) 1.1 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例&#xff1a; &#xff08;1&#xff09;创建一个…...

CNVD漏洞和证书挖掘经验总结

前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题&#xff0c;根据过往成功归档的漏洞和未归档的漏洞总结出的经验&#xff0c;也确实给审核的大佬们添了很多麻烦&#xff08;主要真的没人教一下&#xff0c;闷着头尝试犯了好很多错误&#xff0c;希望各位以后交一个…...

阿里rtc旁路推流TypeScript版NODE运行

阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...

计算机书籍分享

0.简介 数据库系统概念、深入理解计算机系统、领域驱动设计、Linux高性能服务器编程 高清版本pdf 1.链接 数据库系统概念&#xff1a; 链接: https://pan.baidu.com/s/17zz7QFevV2Eni9qHJyLEGA 提取码: wfrx 深入理解计算机系统 链接: https://pan.baidu.com/s/19yiJG8GqHJR…...

处理ASAM-MDF格式的开源python库asammdf

asammdf是一个强大的Python库&#xff0c;专为处理ASAM&#xff08;Association for Standardization of Automation and Measuring Systems&#xff09;MDF&#xff08;Measurement Data Format&#xff09;文件而设计。MDF是一种用于存储测量和诊断数据的标准格式&#xff0c…...

物业管理小程序开发

物业小程序的开发是一个综合性的项目&#xff0c;旨在提升物业管理效率和增强业主的服务体验。以下是关于物业小程序开发的一些关键方面&#xff1a; 一、需求分析 目标用户&#xff1a;识别主要用户群体&#xff0c;包括业主、租户、物业管理人员等。 功能需求&#xff1a; 物…...

【Vue】Pinia

系列文章目录 第八章 Pinia 文章目录 系列文章目录前言一、安装和配置&#xff1a;二、基本使用三、一个更真实的例子 前言 Pinia是Vue.js应用程序的状态管理库。它提供了一种简单&#xff0c;轻量级的解决方案&#xff0c;用于在Vue应用程序中管理和维护状态。Pinia库的特点…...

帕金森病患者的生命长度:科学管理与乐观心态是关键

在快节奏的现代生活中&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;当“帕金森病”这个名词悄然进入我们的视野时&#xff0c;不少人心中难免会涌起一丝不安与担忧。帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;确实给患者的日常生活带…...

详解Linux中cat命令

在 Linux 命令的世界中&#xff0c;cat 命令就像是一位多才多艺的艺术家&#xff0c;它能够将文本文件的美妙旋律编织在一起&#xff0c;或者单独演奏它们的每一个音符。下面&#xff0c;让我们以一种充满情感的方式&#xff0c;用 Markdown 格式来探索 cat 命令的多种用途。 …...

Mysql高级篇(中)—— SQL优化之查询截取分析

SQL优化之查询截取分析 一、慢查询日志&#xff08;1&#xff09;简述&#xff08;2&#xff09;如何开启&#xff08;3&#xff09;慢查询日志分析工具介绍(了解)&#xff08;4&#xff09;官方工具 mysqldumpslow简述如何使用 二、SHOW PROCESSLIST三、&#xff08;了解&…...

企业如何制作一个官方网站?

随着实体宣传的减弱&#xff0c;提高线上的宣传是新式的宣传方式&#xff0c;那么企业搭建网站成为线上宣传的重要途径。企业如何去搭建网站呢&#xff1f;如何拥有一个专业的网站来展示企业文化和企业销售产品&#xff1f;今天我给大家带来干货&#xff1a;如何一步步构建自己…...

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么&#xff1f;有什么限制条件&#xff1f;为什么&#xff1f;对CPU和GPU产生的影响分别是什么&#xff1f; 原理&#xff1a;Unity运行时可以将一些物体进行合并&#xff0c;从而用一个描绘调用来渲染他们&#xff0c;就是一个drawcall批次。 限…...

如何查看线程

1、首先找到我们的电脑安装jdk的位置&#xff0c;这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok&#xff0c;那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程&#xff1a; jconsole 这里能够罗列出你系统上的 java 进程&#xff0…...

详细分析Spring的动态代理机制

文章目录 1. JDK动态代理和CGLIB动态代理的区别1.1 适用范围1.2 生成的代理类1.3 调用方式 2. 问题引入3. 创建工程验证 Spring 默认采用的动态代理机制3.1 引入 Maven 依赖3.2 UserController.java3.3 UserService.java3.4 UserServiceImpl.java&#xff08;save方法添加了Tra…...

Redis数据类型,使用场景,事物及分布式锁

文章目录 关于Redis1.常用数据类型1.字符串&#xff08;String&#xff09;2.哈希&#xff08;Hash&#xff09;3.列表&#xff08;List&#xff09;4.集合&#xff08;Set&#xff09;5.有序集合&#xff08;Sorted Set&#xff09;6.位图&#xff08;Bitmap&#xff09;7.超日…...

目标检测系列(一)什么是目标检测

目录 一、相关名词解释 二、目标检测算法 三、目标检测模型 四、目标检测应用 五、目标检测数据集 六、目标检测常用标注工具 一、相关名词解释 关于图像识别的计算机视觉四大类任务&#xff1a; 分类&#xff08;Classification&#xff09;&#xff1a;解决“是什么&…...

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”&#xff0c;其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”&#xff0c;其他默认 …...

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…...

3步轻松掌握:163MusicLyrics歌词下载完全指南

3步轻松掌握&#xff1a;163MusicLyrics歌词下载完全指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为找不到高质量的LRC歌词而烦恼吗&#xff1f;163MusicLyri…...

将HermesAgent项目接入Taotoken的详细配置步骤与注意事项

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 将HermesAgent项目接入Taotoken的详细配置步骤与注意事项 本文旨在为开发者提供一份清晰的指南&#xff0c;帮助你将HermesAgent项…...

LangGraph 并发执行不是开 Goroutine 那么简单:状态竞争与事务处理

LangGraph 并发执行不是开 Goroutine 那么简单:状态竞争与事务处理深度解析 元数据 关键词:LangGraph, 大语言模型工作流, 有状态并发, 状态一致性, 事务处理, 多Agent系统, 分布式状态管理 摘要:很多开发者初次接触LangGraph的并发特性时,会下意识将其等同于传统协程/线程…...

Linuxbonding链路异常定位实战

Linuxbonding链路异常定位实战这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在bonding链路&#xff0c;重点讨论链路聚合、冗余切换和接口状态。在真实生产环境中&#xff0c;bonding链路相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、…...

【2026最新】鸿蒙NEXT ArkUI实战:培训班管理系统UI界面开发全攻略

鸿蒙UI开发总是踩坑&#xff1f;ArkUI组件用法记不住&#xff1f;本文用15分钟带你彻底搞懂ArkUI核心组件、布局系统、自定义组件和交互动画&#xff0c;附完整培训班管理系统实战代码和踩坑记录&#xff0c;让你的鸿蒙App界面从此丝滑流畅&#xff01;一、培训班管理界面设计1…...

未来之窗昭和仙君(九十三)用户指引自助教学源码—东方仙盟

代码<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>你的导师-未来之窗</title> <style>*…...

Linux压缩归档与备份文件管理

Linux压缩归档与备份文件管理在 Linux 运维工作中&#xff0c;压缩与归档几乎无处不在。日志备份、数据迁移、配置留档、故障现场保存&#xff0c;都会涉及文件打包和压缩。如果缺乏规范&#xff0c;备份文件很容易散落各处、命名混乱、占用失控&#xff0c;最终从保障手段变成…...

基于SpringBoot+Flowable的办公流程审批系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Flowable框架的办公流程审批系统以解决传统审批模式中存在的效率低下问题。当前多数组织机构在日常运营中普遍采用人工审批…...

Linux系统信息查询全攻略:从内核到发行版的深度解析与脚本实践

1. 项目概述&#xff1a;一个看似简单却暗藏玄机的基础操作“查看Linux系统版本”&#xff0c;这几乎是每个运维工程师、开发人员乃至普通用户在接触Linux系统时&#xff0c;第一个需要掌握的命令。它简单到常常被新手教程一笔带过&#xff0c;却又复杂到足以让老手在排查问题时…...

FontForge:从零到一的免费字体设计全攻略

FontForge&#xff1a;从零到一的免费字体设计全攻略 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 你是否曾经想过亲手设计一款属于自己的字体&#xff1f;也许你为…...