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

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

一、题目要求

给定两个整数数组 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;}
}

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

相关文章:

  • 【报错解决】ValueError: Compression type zstd not supported
  • 【LeetCode】十三、分治法:多数元素 + 最大子序列和
  • 【Linux】【部署】主机初始化
  • 基于Java的壁纸网站设计与实现
  • 鸿蒙HarmonyOS深度探索课程
  • Proteus-51单片机-DS18B20多点测温
  • Angluar 实现pdf页面预览以及编辑
  • MATLAB常用语句总结7
  • 技术驱动:探索SpringBoot的大文件上传策略
  • 横截面数据回归
  • 2023-2024华为ICT大赛中国区 实践赛昇腾AI赛道 全国总决赛 理论部分真题
  • math.round和math.floor相互转化
  • CentOS 7配置阿里云镜像源及其加速
  • WRF学习——使用CMIP6数据驱动WRF/基于ncl与vdo的CMIP6数据处理
  • Qt 实战(7)元对象系统 | 7.1、简介
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • css属性的继承、初识值、计算值、当前值、应用值
  • E-HPC支持多队列管理和自动伸缩
  • If…else
  • interface和setter,getter
  • IOS评论框不贴底(ios12新bug)
  • JavaScript 基础知识 - 入门篇(一)
  • jquery ajax学习笔记
  • Mysql5.6主从复制
  • Vue 2.3、2.4 知识点小结
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 仿天猫超市收藏抛物线动画工具库
  • 高程读书笔记 第六章 面向对象程序设计
  • 给Prometheus造假数据的方法
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 警报:线上事故之CountDownLatch的威力
  • 聚簇索引和非聚簇索引
  • 码农张的Bug人生 - 初来乍到
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一、python与pycharm的安装
  • 国内开源镜像站点
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #100天计划# 2013年9月29日
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (12)目标检测_SSD基于pytorch搭建代码
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (ZT)出版业改革:该死的死,该生的生
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (五)MySQL的备份及恢复
  • (原創) 物件導向與老子思想 (OO)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)h264中avc和flv数据的解析
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net 4.0发布后不能正常显示图片问题
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Micro Framework初体验