一起学习LeetCode热题100道(47/100)

embedded/2024/11/14 19:28:48/

47.从前序与中序遍历序列构造二叉树(学习)

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

解析:
一、找到根节点:
先序遍历的第一个元素是 3,所以根节点是 3。

二、分割中序遍历数组:
1.在中序遍历数组 [9, 3, 15, 20, 7] 中找到 3 的索引,为 1。
2.因此,左子树的中序遍历是 [9],右子树的中序遍历是 [15, 20, 7]。

三、确定子数组的长度:
1.左子树中序遍历的长度是 1,所以左子树先序遍历的长度也是 1(从第二个元素开始,即 9)。
2.右子树的中序遍历长度是 3,所以右子树先序遍历是从 20 开始的 3 个元素([20, 15, 7])。

四、递归构建子树:
1.使用 [9] 和 [9] 构建左子树(注意这里左子树先序遍历和中序遍历都只有一个元素,且相同)。
2.使用 [15, 20, 7] 和 [20, 15, 7] 构建右子树(递归过程相同,但规模更小)。

五、返回根节点:
最终返回构建好的根节点 3,其左子节点是 9,右子树是一个包含 20 为根节点的子树。

var buildTree = function (preorder, inorder) {if (preorder.length === 0 || inorder.length === 0) {return null;}// 先序遍历的第一个元素是根节点  const rootVal = preorder[0];let root = new TreeNode(rootVal);// 在中序遍历中找到根节点的位置  let inorderRootIndex = inorder.indexOf(rootVal);// 切割中序遍历数组,得到左子树和右子树的中序遍历  const inorderLeft = inorder.slice(0, inorderRootIndex);const inorderRight = inorder.slice(inorderRootIndex + 1);// 根据中序遍历的切割,切割先序遍历数组  // 注意,左子树的先序遍历长度应该和中序遍历长度一致  const preorderLeft = preorder.slice(1, 1 + inorderLeft.length);const preorderRight = preorder.slice(1 + inorderLeft.length);// 递归构建左子树和右子树  root.left = buildTree(preorderLeft, inorderLeft);root.right = buildTree(preorderRight, inorderRight);return root;
};

http://www.ppmy.cn/embedded/98626.html

相关文章

qt使用menu

思路&#xff1a;实例化一个QMenu的对象&#xff0c;然后通过函数addAction添加里面的子项。然后重写鼠标事件&#xff0c;比如当双击鼠标的时候&#xff0c;调用实例化对象的exec()函数&#xff0c;exec函数内传入重写的鼠标事件的全局坐标&#xff0c;就可以在鼠标点击的位置…

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;是一种新型的元启发式算法&#xff0c;它于2024年4月由Youfa Fu等人提出&#xff0c;并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…

SQL高级编程:掌握自定义函数和过程的艺术

标题&#xff1a;SQL高级编程&#xff1a;掌握自定义函数和过程的艺术 在SQL的世界里&#xff0c;数据操作不仅仅局限于简单的查询和更新。通过自定义函数&#xff08;User-Defined Functions, UDFs&#xff09;和存储过程&#xff08;Stored Procedures&#xff09;&#xff…

Linux源码阅读笔记-USB设备驱动架构

总线速度及主机控制器 USB系统架构 USB系统主机端提供为4个引脚的A型接口&#xff0c;USB外围设备通过4个引脚的B型接口和主机端连接。那4个引脚&#xff08;一条电压线VBUS、一条地线GND、一条正方向传输数据的D和一条反方向传输数据的D-线。&#xff09;USB主机和USB设备收发…

平衡日常工作与提升式学习话题有感

文章目录 前言1.工作是什么&#xff1f;2.怎么提升技术&#xff1f;3.工作/学习与生活的平衡总结 前言 这篇博客是针对程序员如何平衡日常编码工作与提升式学习&#xff1f;这个话题进行的个人观点阐述&#xff0c;个人所思所想罢了。 刚毕业没几年&#xff0c;水平有限&#…

交流220V转5V100MA非隔离降压芯片应用在烧水壶上的设计与实现

### 交流220V转5V100MA非隔离降压芯片应用在烧水壶上的设计与实现 #### 引言 随着科技的不断发展&#xff0c;智能家居产品逐渐走进千家万户。烧水壶作为日常生活中常用的电器之一&#xff0c;其智能化和安全性也越来越受到消费者的关注。本文将介绍一种基于AH8652芯片的交流…

Java-接口查询没有值,需要多次调用直到有值,实现方法

CompletableFuture 结合定时重试的策略 使用 CompletableFuture 结合定时重试的策略可以有效地处理异步操作,并在遇到失败时自动重 试。下面是一个使用 Java 实现的例子,展示了如何利用 CompletableFuture 和定时重试来获取数 据。 import java.time.Duration; import ja…

原生 cesium 实现热力图功能

预览&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationCesiumJS&classifyexpand&idheatMap 国内预览&#xff1a;http://threehub.cn/ 开源地址&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/exampl…