【力扣题解】P105-从前序与中序遍历序列构造二叉树-Java题解

news2025/1/16 2:58:10

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P105-从前序与中序遍历序列构造二叉树-Java题解
    • 🌏题目描述
    • 💡题解
    • 🌏总结


【力扣题解】P105-从前序与中序遍历序列构造二叉树-Java题解

P105.从前序与中序遍历序列构造二叉树

🌏题目描述

给定两个整数数组 preorderinorder ,其中 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
  • preorderinorder无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

💡题解

public static TreeNode buildTree(int[] preorder, int[] inorder) {
    // 空树
    if (preorder.length == 0) {
        return null;
    }
    // 根节点
    int rootValue = preorder[0];
    // 构造树
    TreeNode root = new TreeNode(rootValue);
    // 只有一个节点, 直接返回树
    if (preorder.length == 1) {
        return root;
    }
    // 在中序数组中查找当前节点(根节点)值的索引
    int divideIndex = 0;
    for (; divideIndex < inorder.length; divideIndex++) {
        if (inorder[divideIndex] == rootValue) {
            break;
        }
    }
    // 根据当前节点的索引切割中序数组
    // 左子数组的元素就是二叉树左子树的所有节点
    // 右子数组的元素就是二叉树右子树的所有节点
    int[] leftInorder = Arrays.copyOfRange(inorder, 0, divideIndex);
    int[] rightInorder = Arrays.copyOfRange(inorder, divideIndex + 1, inorder.length);
    // 分割前序数组
    // 先移除前序数组的最后一个元素(当前节点/根节点), 因为根节点的值我们已经使用了
    preorder = Arrays.copyOfRange(preorder, 1, preorder.length);
    // 然后根据切割后的中序左右数组的长度切割后序数组
    // 因为中序数组和后序数组对应的长度都是相等的
    int[] leftPreorder = Arrays.copyOfRange(preorder, 0, divideIndex);
    int[] rightPreorder = Arrays.copyOfRange(preorder, divideIndex, preorder.length);
    // 递归构造左子节点和右子节点
    root.left = buildTree(leftPreorder, leftInorder);
    root.right = buildTree(rightPreorder, rightInorder);
    // 返回根节点
    return root;
}

时间复杂度:O(n),二叉树有 n 个节点,需要递归 n 次递归函数。

🌏总结

由二叉树的性质我们可以知道,如果知道一个二叉树的中序与前序序列,那么我们是可以还原这棵二叉树的,那么具体怎么还原呢?二叉树的前序序列的第一个元素就是二叉树的根节点值,然后根节点值在中序序列中是在序列的中间,左右两边分别是左子树和右子树的所有节点值,所以我们使用递归,每次在前序序列中找到当前子树的根节点,使用根节点构建树,然后根据根节点将中序序列分为两个子数组,分别代表当前节点(根节点)的左右子树,而中序序列和前序序列对应的子树的序列长度是相同的,所以我们可以根据中序序列的子数组再将前序序列分为两个子数组,然后根据分开后的四个子数组递归地构建当前节点的左右子节点,就可以还原这棵二叉树。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

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

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

相关文章

论文速递|Management Science 11月文章合集(下)

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Management Science11月份发布的47篇文章的基本信息&#xff0c;旨在帮助读者快速洞察行业最新动态。本文为第三部分。 文章1 ● 题目&#xff1a;…

Linux:apache优化(7)—— 访问控制

作用&#xff1a;为apache服务提供的页面设置客户端访问权限&#xff0c;为某个组或者某个用户加密访问&#xff1b; /usr/local/httpd/bin/htpasswd -c /usr/local/httpd/conf/htpasswd tarro1 #添加admin用户&#xff0c;可以在两个路径中间添加-c是新建文件删除原文件&#…

当你的电脑在安装Windows更新后出现问题时怎么办,这里提供办法

Windows更新通常会为你的电脑带来错误修复、安全补丁和新功能,但它们也可能会带来性能下降甚至引发恐慌的数据丢失等问题,从而适得其反。如果你在安装更新后发现了一些奇怪之处,你可以将其回滚,尝试重新启动。 Windows更新主要有两种:质量更新和功能更新。高质量的更新包…

16.综合项目实战

一、基础演练&#xff1a; 1、建库、建表 # 创建数据库 create database mysql_exampleTest; use mysql_exampleTest; # 学生表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(20) NOT NULL DEFAULT , s_birth VARCHAR(20) NOT NULL DEFAULT , s_sex VARC…

RocketMQ(Linux版本5.1.4)

1、停止之前的运行服务 [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# sh bin/mqshutdown namesrv No mqnamesrv running. [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-r…

【编译原理】期末预习做题向I

新的一年希望可以成为更好的人嘿嘿&#xff01; 这一篇基本就是把 up 讲的题都截了一遍然后加了点自己的笔记啥的 O.o &#xff08;不妥的话会删掉的 qwq&#xff0c;希望没事嘿嘿&#xff09; 来源&#xff1a;混子速成 I. 绪论 记住组成部分 II. 前后无关文法和语言 1.…

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址&#xff1a; github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍&#xff1a; 眼睛注视&#xff08;eye gaze&#xff09; 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外&#xff0c;它还被用…

zabbix监控基础

目录 一.zabbix概述 1.zabbix程序结构 2.Zabbix 监控原理 3.zabbix中核心的资源介绍 4.zabbix-agent支持的协议 二.zabbix监控环境搭建 1.zabbix服务器端 1) 基本配置 2) 安装 2.配置zabbix 1) 数据库设置 2) zabbix设置 3) ph…

轻量应用服务器与云服务器CVM对比——腾讯云

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

Android 跨进程之间通信(IPC)方式之ContentProvider

Android 跨进程之间通信 Android 跨进程之间通信(IPC)方式之BroadcastReceiverAndroid 跨进程之间通信(IPC)方式之ContentProvider 文章目录 Android 跨进程之间通信前言一、ContentProvider 是什么&#xff1f;二、如何利用ContentProvider跨进程通信1.创建自定义ContentProv…

编译原理----FIRST集,LARST集,FIRSTVT集,LASTVT集

目录 FIRST集&#xff1a; LARST集&#xff1a; FIRSTVT集: LASTVT集&#xff1a; 构造规则&#xff1a; FIRST集&#xff1a; &#xff08;1&#xff09;A-->&#xff0c;若是终结符&#xff0c;那么FIRST&#xff08;A&#xff09;&#xff0c;若是非终结符&#xf…

啊哈c语言——逻辑挑战6:奔跑的小人

首先我们来设计这个小人&#xff1a; 将这个小人身体的三部分分为3行来分别表示&#xff1a; 第1行用一个大写字母O表示小人的脑袋。 第2行用左尖括号表示小人的右手&#xff0c;用大写字母H表示小人的身 体&#xff0c;用右尖括号>表示小人的右手。 第3行用两个大写字母…

集群部署篇--Redis 集群分片模式

文章目录 前言一、Redis 分片集群介绍1.1 介绍&#xff1a;1.2 工作机制&#xff1a;1.2.1 节点&#xff1a;1.2.2 槽 slot&#xff1a;1.2.3 故障转移&#xff1a; 二、Redis 分片集群搭建:2.1 配置文件&#xff1a;2.2 redis 部署&#xff1a;2.3 redis 集群创建&#xff1a;…

杂文月刊投稿方式论文发表要求

《杂文月刊》是由国家新闻出版总署批准的正规文学类期刊。主要内容取向&#xff1a;杂文、散文、小说、诗歌、漫画、文学评论、艺术评论、戏剧文化、地方文化、非遗文化、美学艺术、教育等历史、文化、文学、艺术类的文章。是广大专家、学者、教师、学子发表论文、交流信息的重…

2024年人工智能领域10大预测

2023年人工智能领域如果只能筛选一个关键词的话&#xff0c;恐怕非“大模型”莫属。大模型的发展在过去一年中&#xff0c;让各行各业发生了天翻地覆的变化&#xff0c;有企业因大模型而新生&#xff0c;有企业因大模型而消亡。企业的变迁跟技术迭代息息相关&#xff0c;而大模…

前端 js 基础(1)

js 结果输出 &#xff08;点击按钮修改文字 &#xff09; <!DOCTYPE html> <html> <head></head><body><h2>Head 中的 JavaScript</h2><p id"demo">一个段落。</p><button type"button" onclic…

【2023】hadoop基础介绍

&#x1f4bb;目录 Hadoop组成HDFSHDFS操作HDFS分布式文件存储NameNode元数据数据读写流程 YARN和MapReduceMapReduce&#xff1a;分布式计算YARN&#xff1a;资源管控调度YARN架构提交任务到**YARN中运行** Hadoop组成 hadoop安装教程可以看我这篇文章> &#x1f345;hado…

论数据资源持有权(上)

关注WX公众号&#xff1a; commindtech77&#xff0c; 获得数据资产相关白皮书下载地址 1. 回复关键字&#xff1a;数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字&#xff1a;光大银行 下载 光大银行-《商业银行数据资产会计核算研究报告》 3. 回复关键字…

c语言之将输入的十进制转换成二进制数并打印原码反码补码

十进制转二进制 首先&#xff0c;我们要知道的是十进制转换成二进制数的方法。我们一般采用的除二取余的方法&#xff0c;在这里我用32位数组来进行转换。 int main() {printf("请输入一个十进制数\n");int n 0;scanf("%d", &n);int arr[32];int* p…

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型

目录 往期精彩内容&#xff1a; 前言 1 快速傅里叶变换FFT原理介绍 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 基于FFTCNN-Transformer的轴承故障识别模型 3.1 网络定义模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 往期精彩内容&…