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

JAVA练习315- 从前序与中序遍历序列构造二叉树

题目概览

给定两个整数数组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保证为二叉树的中序遍历序列

来源:105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

解题分析

方法:模拟

前序是:根 - 左 - 右,中序是 左 - 根 - 右。我们可以根据前序数组第一个元素拿到根节点,然后再到中序数组中进行拆分,我们定义前序数组的范围为 [ pi, pj ],中序数组的范围为 [ ii, ij ],中序数组中根节点的索引为 root,那么可以得到每个子数组的范围:

将这个范围作为参数继续往下传,然后重复拿根节点+拆分的操作即可,直到数组为空或只有一个元素停止。

时间复杂度:O(n)
空间复杂度:O(n)

/** * 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[] preorder, int[] inorder) { int n = preorder.length; if (n == 0) { return null; } return buildTree(preorder, inorder, 0, n - 1, 0, n - 1); } public TreeNode buildTree(int[] preorder, int[] inorder, int pi, int pj, int ii, int ij) { if (pi > pj || ii > ij) { return null; } TreeNode node = new TreeNode(preorder[pi]); if (pi == pj || ii == ij) { return node; } int root = preorder[pi]; int rootIndex = ii; for (int i = ii; i <= ij; ++i) { if (root == inorder[i]) { rootIndex = i; } } node.left = buildTree(preorder, inorder, pi + 1, pi + rootIndex - ii, ii, rootIndex - 1); node.right = buildTree(preorder, inorder, pi + rootIndex - ii + 1, pj, rootIndex + 1, ij); return node; } }
http://www.jsqmd.com/news/1220489/

相关文章:

  • Qwopus3.6-27B-Coder-4bit多语言支持详解:中文、英文、日文等多语言代码生成
  • 二年级奥数:(3):乘法含义 + 相同加数求和 + 2、5、25 凑整巧算
  • DFS、BFS与01BFS算法详解与对比
  • 【关注可白嫖源码】--课程设计--毕业设计--springboot校园心理咨询服务平台[编号:project81517](案件分析)
  • RoosterCollect-EV与MSC-EV生产工艺:外泌体清洁收集和规模化放大思路
  • 重庆旧房改造公司实测排行:工艺与售后核心维度 - 互联网科技品牌测评
  • 雷达中国官方售后服务中心|官方地址及售后热线权威信息通告(2026年7月最新) - 亨得利官方服务中心
  • WannaCry勒索软件终极恢复指南:如何免费解密被加密文件
  • 【音频基础学习】第 5 天,理解音量、增益和分贝
  • OpenHarmony 本地文件 FS 文件系统操作封装(API Version23 + 适配版)
  • `grpcio` 是 Google 开发的 gRPC 框架的 Python 实现,是一个高性能、开源的通用 RPC(远程过程调用)框架
  • JAVA练习314- 二叉树展开为链表
  • 如何安装与配置BlockLauncher:Android版Minecraft启动器的快速入门教程
  • Agent Function Calling 错误分类:网络超时权限与业务异常
  • Selene 源码解析:深入理解 Python 浏览器测试框架的设计原理
  • TMS320F2838x GPIO复用配置详解:从寄存器操作到多核控制
  • 本手、俗手、妙手:围棋术语中的哲学智慧
  • GEO源码部署主体爱搜索GEO:赋能企业构建AI搜索核心优势实战指南 - 品牌报告
  • SpringBoot 自动配置完整原理
  • 2026 年 7 月百达翡丽中国官方授权售后网点完整名录|官方搬迁、新店启用统一公示公告 - 百达翡丽中国服务中心
  • Priceline Design System 代码迁移指南:从旧版本升级到最新版本
  • 实测甄选|天津靠谱奢侈品包包回收机构推荐,正规高价更安心 - 讯息早知道
  • GimpPs终极指南:如何3步将GIMP界面秒变Photoshop专业风格
  • SQL 递归查询实战:CTE 递归处理树形组织架构和物料 BOM
  • ECS-Network-Racing-Sample:Unity ECS多人赛车游戏完整入门指南
  • Win11Debloat:让Windows 11回归简洁本质的完整解决方案
  • InAppBillingPlugin 调试与排错:解决常见支付问题的 15 个实用技巧
  • 2026年毕业论文修改工具深度横评:学范文等五大平台实战避坑指南
  • STM32软件模拟I2C驱动AT24C02实战指南
  • 2026国内玻璃水滑道与高空漂流专业服务商综合评测及合规选型指南 - 互联网科技品牌测评