秋招力扣刷题——从前序与中序遍历序列构造二叉树

news2024/11/24 17:01:00

一、题目要求

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

二、解法思路

  • 根据二叉树的遍历结构重构二叉树,至少两种遍历方式结合,且其中一种必须是中序遍历。
  • 思路:根据前序遍历找到根节点,然后从中序遍历中找到根节点的下标,拆分数组分别构造左子树和右子树。
  • 代码1:此代码分割数组是左闭右开
class Solution {
    Map<Integer,Integer> cache=new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i=0;i<inorder.length;i++){
            cache.put(inorder[i],i);
        }
        return build(preorder,0,preorder.length,inorder,0,inorder.length);
    }
    private TreeNode build(int[] preorder,int prestart,int preend,int[] inorder,int instart,int inend){
            if(prestart>=preend||instart>=inend)return null;
            TreeNode root=new TreeNode(preorder[prestart]);
            int leftnum=cache.get(preorder[prestart])-instart;
            //前序加1是因为要跳过根节点
            root.left=build(preorder,prestart+1,prestart+leftnum+1,inorder,instart,instart+leftnum);
            //中序加一也是因为要跳过根节点
            root.right=build(preorder,prestart+leftnum+1,preend,inorder,instart+leftnum+1,inend);
            return root;
        }
}
  • 代码2:次代码分割数组是左闭右闭
class Solution {
    Map<Integer,Integer> cache=new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(inorder.length==1)return new TreeNode(inorder[0]);
        for(int i=0;i<inorder.length;i++){
            cache.put(inorder[i],i);
        }
        return build(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
    }
    private TreeNode build(int[] preorder,int[] inorder,int prebegin,int preend,int inbeggin,int inend){
        if(prebegin>preend||inbeggin>inend)return null;
        TreeNode root=new TreeNode(preorder[prebegin]);
        int index=cache.get(preorder[prebegin]);
        int leftnum=index-inbeggin;
        root.left=build(preorder,inorder,prebegin+1,prebegin+leftnum,inbeggin,inbeggin+leftnum);
        root.right=build(preorder,inorder,prebegin+leftnum+1,preend,inbeggin+leftnum+1,inend);
        return root;
    }
}

:两种代码的结束条件以及分割的右区间处理方式不同,后者更容易理解一点。

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

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

相关文章

操作系统智能助手OS Copilot评测报告

背景 如果不是朋友告知&#xff0c;我还不知道阿里云推出了【操作系统智能助手OS Copilot】这样一款产品。 我做系统运维的工作还是挺多的&#xff0c;知道系统运维工作的一些痛点&#xff1b;例如&#xff1a; Linux命令繁杂&#xff0c;想全部记住不太可能&#xff0c;多数…

自注意力 公式解释

公式 (\mathbf{y}_i f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d) 描述了自注意力机制中单个词元的输出表示如何生成。我们来逐步解释这个公式&#xff1a; 输入序列 (\mathbf{x}_1, \mathbf{x}_2, \ldots, \math…

MySQL之备份与恢复(八)

备份与恢复 还原逻辑备份 如果还原的是逻辑备份而不是物理备份&#xff0c;则与使用操作系统简单地复制文件到适当位置的方式不同&#xff0c;需要使用MySQL服务器本身来加载数据到表中。在加载导出文件之前&#xff0c;应该先花一点时间考虑文件有多大&#xff0c;需要多久加…

数据结构--二叉树和堆

目录 1.基本概念 2.树的遍历方法 3.满二叉树&&完全二叉树 4.逻辑结构&&物理结构 5.推理公式 6.二叉树应用--堆 7.简单实现堆 1.基本概念 &#xff08;1&#xff09;这个里面的概念还是比较多的&#xff0c;但是大部分我们只需要了解即可&#xff0c;因为…

如何实现一套键盘鼠标控制两台计算机(Mouse Without Borders快速上手教程)

需求背景 当我们需要同时使用一台主机和一台笔记本的时候&#xff0c;如果使用两套键盘和鼠标分别操作各自的系统&#xff0c;非常地不便捷且非常占据桌面空间。那么如何使用一套键盘鼠标控制两台电脑呢&#xff1f; 需求实现 软件说明 我们可以使用微软官方的一款软件Mous…

vscode使用Git的常用操作

主打一个实用 查看此篇之前请先保证电脑安装了Git&#xff0c;安装教程很多&#xff0c;可自行搜索 一.初始化本地仓库&#x1f534; 使用vscode打开项目文件夹如图所使初始化仓库&#xff0c;相当于命令行的git init 二.提交到暂存区&#x1f534; 二.提交到新版本&#x1f…

07浅谈大语言模型可调节参数tempreture

浅谈temperature 什么是temperature&#xff1f; temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性&#xff1a; 控制确定性&#xff1a; temperature参数可以控制模型生成文本的确定性&#xff0c;大部分模型中temperatur…

RabbitMq - Java客户端基础【简单案例 +Work模型】

目录 1、前置知识 1.1、AMQP怎么理解 1.2、Spring AMQP是什么 1.3、为什么要了解Spring-AMQP&#xff1f; 2、使用Spring-AMQP实现一个发消息案例 3、Work模型 问题&#xff1a; 优化&#xff1a; 小结&#xff1a;Work模型的使用&#xff1a; 1、前置知识 1.1、AMQP怎…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备&#xff08;如传感器&#xff09;提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似&#xff0c;状…

妈妈带女儿美在心里

在这个充满温情与惊喜的午后&#xff0c;阳光温柔地洒落在每一个角落&#xff0c;仿佛连空气弥漫着幸福的味道。就在这样一个平凡的时刻&#xff0c;一段关于爱与成长的温馨画面&#xff0c;悄然在网络上绽放&#xff0c;引爆了无数人的心弦——#奚梦瑶2岁女儿身高#&#xff0c…

【Java】详解String类中的各种方法

创建字符串 常见的创建字符串的三种方式&#xff1a; // 方式一 String str "hello world"; // 方式二 String str2 new String("hello world"); // 方式三 char[] array {a, b, c}; String str3 new String(array); "hello" 这样的字符串字…

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库&#xff0c;以其卓越的读写速度而著称&#xff0c;广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

零基础STM32单片机编程入门(九)IIC总线详解及EEPROM实战含源码视频

文章目录 一.概要二.IIC总线基本概念1.总体特征2.通讯流程 三.EEPROM介绍1.M24C08基本介绍2.向M24C08写一个字节时序图3.从M24C08读一个字节时序图 四.GPIO模拟IIC驱动M24C08读写五.CubeMX工程源代码下载六.讲解视频链接地址七.小结 一.概要 IIC(Inter&#xff0d;Integrated …

认识异常详解

1. 异常的定义&#xff1a; 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型&#xff1a;受检异常&#xff08;Checked Exception&#xff09;和未受检异常&#xff08;Unchecked Exception&…

C9联盟是什么?

九校联盟&#xff08;C9 League&#xff09;&#xff0c;简称C9联盟&#xff0c;是中国首个顶尖大学间的高校联盟&#xff0c;于2009年10月正式启动。 其成员都是国家首批“985工程”重点建设的一流大学&#xff0c;包括北京大学、清华大学、哈尔滨工业大学、复旦大学、上海交通…

水仙花数算法

一、水仙花的传说 希腊神话故事 传说希腊神话里&#xff0c;美少年纳西索斯&#xff08;Narcissus&#xff09;是希腊最俊美的男子&#xff0c;无数的少女对他一见倾心&#xff0c;可他却自负地拒绝了所有的人。这当中包括美丽的山中仙女伊可&#xff08;Echo&#xff09;。伊可…

(南京观海微电子)——MOS管原理及应用区别

MOS管&#xff1a; 全称为金属氧化物半导体场效应管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff09;&#xff0c;也被称为MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;。它是一种半导体器件&#xff0c;常用…

Vulkan 学习(1)---- Vulkan 基本概念和发展历史

目录 Vulkan及其演化史Vulkan 基本概念基本术语 Vulkan 的原理Vulkan应用程序Vulkan的编程模型硬件初始化窗口展示表面资源设置流水线设置描述符和描述符缓冲池基于SPIR-V的着色器流水线管理指令的记录队列的提交 Vulkan及其演化史 目前主流的图形渲染API有OpenGL、OpenGL ES、…

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序&#xff1a; npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成&#xff1a; const {Sequelize} re…

【Linux系统编程】文件系统

介绍&#xff1a; 文件系统是操作系统中负责管理和存储文件信息的软件结构&#xff0c;它组织和管理磁盘上的文件和目录&#xff0c;并定义了文件的存储结构。 Linux文件系统采用树状结构&#xff0c;只有一个根目录&#xff08;用“/”表示&#xff09;&#xff0c;其中含有下…