【Leetcode 热题 100】105. 从前序与中序遍历序列构造二叉树

devtools/2024/12/23 23:45:27/

问题背景

给定两个整数数组 p r e o r d e r preorder preorder i n o r d e r inorder inorder,其中 p r e o r d e r preorder preorder 是二叉树的 先序遍历 i n o r d e r inorder inorder 是同一棵树的 中序遍历,请构造二叉树并返回其根节点。

数据约束

  • 1 ≤ p r e o r d e r . l e n g t h ≤ 3000 1 \le preorder.length \le 3000 1preorder.length3000
  • i n o r d e r . l e n g t h = p r e o r d e r . l e n g t h inorder.length = preorder.length inorder.length=preorder.length
  • − 3000 ≤ p r e o r d e r [ i ] , i n o r d e r [ i ] ≤ 3000 -3000 \le preorder[i], inorder[i] \le 3000 3000preorder[i],inorder[i]3000
  • p r e o r d e r preorder preorder i n o r d e r inorder inorder无重复 元素
  • i n o r d e r inorder inorder 均出现在 p r e o r d e r preorder preorder
  • p r e o r d e r preorder preorder 保证 为二叉树的前序遍历序列
  • i n o r d e r inorder inorder 保证 为二叉树的中序遍历序列

解题过程

大体上的流程就是不断地从先序序列中确定根节点,再从中序序列中根据这个根节点的位置去划分左右子树,这样就能构建每一棵子树。
需要注意的是,用哈希表存储中序序列中每个节点出现的位置,能够避免在递归的过程中再用循环查找,能够提高效率。
通过这道题体会到的是,保证方法实现的正确性之后,剩下只要调用的时候填对参数就行了。

碎碎念:几年前第一次看这个实现的时候一窍不通,难过地掉头发。如今能不看题解自己想到定义哈希表,完整地实现出来,原来从不得其门而入到现在已经过去这么久了……

具体实现

/*** 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;// 能够确定长度的列表,在初始化的时候就定好,尽可能地避免扩容,养成好习惯Map<Integer, Integer> map = new HashMap<>(n);for(int i = 0; i < n; i++) {map.put(inorder[i], i);}return dfs(preorder, 0, n, 0, n, map);}private TreeNode dfs(int[] preorder, int preL, int preR, int inL, int inR, Map<Integer, Integer> map) {if(preL == preR) {return null;}// 根据左子树中元素的数量来确定某几个参数,体会一下偏移的思想int leftCount = map.get(preorder[preL]) - inL;// 其中有几个参数要加一,是因为要跳过当前节点本身TreeNode left = dfs(preorder, preL + 1, preL + 1 + leftCount, inL, inL + leftCount, map);TreeNode right = dfs(preorder, preL + 1 + leftCount, preR, inL + 1 + leftCount, inR, map);return new TreeNode(preorder[preL], left, right);}
}

http://www.ppmy.cn/devtools/144835.html

相关文章

【JAVA】JAVA接口公共返回体ResponseData封装

一、JAVA接口公共返回体ResponseData封装&#xff0c;使用泛型的经典 例子 public class ResponseData<T> implements Serializable { /** * */ private static final long serialVersionUID 7098362967623367826L; /** * 响应状态码 */ …

基于 SSM 和 Vue 架构的新锐台球厅管理系统:创新设计引领高效实现

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

贪心算法 greedy

文章目录 参考贪心算法[Leetcode455 分发饼干](https://leetcode.cn/problems/assign-cookies/description/)分析题解 [Leetcode135 分发糖果](https://leetcode.cn/problems/assign-cookies/description/)分析题解 leetcode435无重叠区间分析题解 参考 https://github.com/ch…

ElasticSearch08-分析器详解

零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器&#xff08;Analyzer&#xff09;是全文搜索的核心组件&#xff0c;它负责将文本转换为一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。 &#xff08;1&#xff…

Windows系统如何配置远程音频

场景 RemoteFx 是 Windows RDP 桌面协议升级版&#xff0c;RDP 8.0起可以使用 RemoteFx 来使用 USB 重定向&#xff0c;将本地 USB 设备通过 RDP 的数据通道重定向到远程桌面&#xff0c;解决云端机器无法使用 USB 设备的问题。 客户端&#xff1a;Windows 10 操作系统 服务…

使用ElasticSearch实现全文检索

文章目录 全文检索任务描述技术难点任务目标实现过程1. java读取Json文件&#xff0c;并导入MySQL数据库中2. 利用Logstah完成MySQL到ES的数据同步3. 开始编写功能接口3.1 全文检索接口3.2 查询详情 4. 前端调用 全文检索 任务描述 在获取到数据之后如何在ES中进行数据建模&a…

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询中非常重要的组成部分&#xff0c;它们由一个或多个值、运算符和PostgreSQL函数组合而成&#xff0c;用于计算出一个单一的结果。这些表达式类似于公式&#xff0c;可以用查询语言编写&#xff0c;并用于查询数据库中的特定数据集。 PostgreSQL表…

Day26下 - BERT项目实战

BERT论文&#xff1a;https://arxiv.org/pdf/1810.04805 BERT架构&#xff1a; BERT实战 1. 读取数据 # pandas 适合表格类数据读取 import pandas as pd import numpy as np# sep: 分隔符 data pd.read_csv(filepath_or_buffer"samples.tsv", sep"\t"…