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

LeetCode题解--105. 从前序与中序遍历序列构造二叉树 1. 题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 //前序遍历 preorder = [3,9,20,15,7] //中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 2. 分析   &nbs... 阅读详情
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // 我们需要跟踪根的位置:前序和中序 都需要
    // 但是前序中根的位置是有迹可循的:i=0,i+左子树节点数...
    private TreeNode helper(int lo,int hi,int preRootIndex,int[] preorder,int[] inorder){
        if(lo>hi||preRootIndex>=preorder.length){
            return null;
        }
        if(lo==hi){
            return new TreeNode(inorder[lo]);
        }
        TreeNode root=new TreeNode(preorder[preRootIndex]);
        // 得到作为根的元素在中序中的位置
        int inRootIndex=val2index.get(root.val);
        // 左子树的根就在前序中根的后面一个(如果根为空?
        // 如果根为空,那么lo和inRootIndex就相等,那么inRootIndex-1就小于lo,返回null
        int preLeftRootIndex=preRootIndex+1;
        root.left=helper(lo,inRootIndex-1,preLeftRootIndex,preorder,inorder);
        // 右子树的根,在当前根+左子树节点数+1
        int preRightRootIndex=preRootIndex+(inRootIndex-1-lo+1)+1;
        root.right=helper(inRootIndex+1,hi,preRightRootIndex,preorder,inorder);
        return root;
    }
    private HashMap<Integer,Integer> val2index=new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i=0;i<inorder.length;i++){
            val2index.put(inorder[i],i);
        }
        return helper(0,inorder.length-1,0,preorder,inorder);
    }
}

这个题以前做过 但是竟然再做还遇到了一些麻烦 看来还是要多模拟一下做法?(就考试做的那种,把算法搞清楚

【中等】力扣算法题解析LeetCode105:从前序与中序遍历序列构造二叉树 给定二叉树的前序和中序遍历序列,要求重建二叉树。核心思路是利用前序遍历确定根节点,通过中序遍历划分左右子树。优化方法包括使用哈希表存储中序索引以加速查找,以及通过索引范围避免数组拷贝。递归过程中,根据根节点位置分别构建左右子树,确保时间复杂度为O(n)。Java实现中,通过维护前序和中序的区间范围递归构造子树,最终返回根节点。 阅读详情

相关推荐

告别仿真报错!手把手教你为Intel MAX10 FPGA定制IBIS模型(附Allegro Skill工具)

本文详细介绍了为Intel MAX10 FPGA定制IBIS模型的完整流程,解决信号完整性仿真中的管脚映射问题。通过Allegro Skill工具自动化处理管脚信息,优化IBIS模型关键段落,提升仿真效率和精度,适用于高速数字电路设计。

weixin_33217202的博客 323

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

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

yyh520025的博客 940

基于Arduino与光电传感器的心率监测系统:从原理到实现的完整指南

光电式心率监测是一种基于光电容积脉搏波描记法(PPG)的非侵入式生命体征测量技术。其核心原理是利用特定波长光线照射皮肤组织,通过检测因血液容积周期性变化导致的反射光强微弱波动,来获取心率信息。这项技术的关键价值在于实现了低成本、便携化的连续生理参数监测,广泛应用于健康管理、运动科学及嵌入式系统教学领域。在工程实践中,信号处理算法(如移动平均滤波与动态阈值峰值检测)对提升测量精度至关重要。本文以Arduino平台为例,详细解析了如何集成MAX30102或Pulse Sensor Amped等光电传感器,结合T

weixin_33461476的博客 245

LeetCode 力扣 105. 从前序与中序遍历序列构造二叉树

题目描述(中等难度) 根据二叉树的先序遍历和中序遍历还原二叉树。 解法一 递归 先序遍历的顺序是根节点,左子树,右子树。中序遍历的顺序是左子树,根节点,右子树。 所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。 生成左子树和右子树就可以递归的进行了。 比如上图的例子,我们来分析一下。 preorder = [3,9,20,1...

wind_liang的博客 1586

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 949

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 396

leetcode105深度解析:从前序与中序遍历序列构造二叉树

本文讲解如何通过前序遍历和中序遍历序列重建二叉树。核心思路是利用前序确定根节点,中序划分左右子树,通过递归解决子问题。具体步骤包括:1)前序首元素为根节点;2)在中序中找到根节点位置划分左右子树;3)根据子树节点数量划分前序序列;4)递归构建左右子树。代码实现中通过HashMap优化查找效率,使时间复杂度降为O(N),空间复杂度为O(N)。关键点在于区间定义和递归终止条件的处理。

lyh2004_08的博客 902

测试用例设计工具大盘点:总有一款适合你

本文旨在帮助测试工程师、开发人员及团队管理者快速了解主流测试用例设计工具的特点、适用场景和选择逻辑。覆盖工具类型包括传统文档工具、开源管理工具、商业集成平台及新兴AI工具,范围涵盖中小团队到大型企业的不同需求。本文从“测试用例设计的痛点”切入,用生活案例解释核心概念;接着按“工具类型”分类盘点主流工具(附优缺点对比表);再通过“小团队/中大型团队/敏捷团队”等真实场景教你选工具;最后展望AI等未来趋势,帮你“一次学透,终身受用”。

项目管理的博客 1592

105.力扣LeetCode_从前序与中序遍历序列构造二叉树

本文介绍了通过先序和中序遍历序列构建二叉树的两种方法:递归法和非递归法。 递归法通过不断分割序列来构建树结构: 先序序列第一个元素作为根节点 在中序序列中找到根节点位置,划分左右子树 递归处理左右子树。 非递归法使用栈来模拟递归过程: 栈用于暂存未确定右子树的节点 通过比较栈顶与中序指针判断节点关系 遇到左子树边界时回溯查找父节点 。 两种方法都利用了先序和中序遍历的特性,递归法直观但可能栈溢出,非递归法效率更高但逻辑更复杂。代码实现均包含详细注释说明关键步骤。

2401_82472941的博客 813

YOLOv8车辆碰撞识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置+目标检测)

随着我国汽车保有量的持续攀升,道路交通事故数量居高不下,车辆碰撞损伤的快速、精准评估已成为交通安全管理、保险理赔定损以及汽车后市场服务中的关键环节。传统的人工目视查验方法高度依赖评估人员的专业经验,不仅主观性强、效率低下,而且在复杂光照、多角度遮挡等真实场景下难以保证评估的一致性和可复现性。计算机视觉与深度学习技术的迅猛发展,为目标检测任务提供了强有力的技术支撑,使得基于视觉的车辆损伤自动化识别成为可能。

斌擎科技 130

自动驾驶算法/规划决策控制算法面经汇总、学习路线、面经心得

自动驾驶算法学习路线,面试求职大全

qq_41667348的博客 1万+

LeetCode第105题_从前序与中序遍历序列构造二叉树

给定两个整数数组preorder和inorder,其中preorder是二叉树的inorder是同一棵树的,请构造二叉树并返回其根节点。

qq_40263592的博客 1579

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3865

题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++

每次在中序遍历序列片段中找到前序遍历序列队首,这是该层的根节点 该位置左侧是左子树,右侧是右子树 再分别在左右子树序列中进行同样操作,找到左右子树的根节点,循环往复得到整棵树 每次找到一层的根节点就从前序遍历序列中出队它 前序遍历序列队列队首用head标记 arrSize表示该次能访问的中序遍历序列片段的长度,若

qwq_ovo_pwp的博客 1014

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

leetcode力扣105. 从前序与中序遍历序列构造二叉树

我是清都山水郎,天教懒慢带疏狂。曾批给露支风券,累奏流云借月章。 诗万首,酒千觞,几曾着眼看侯王。玉楼金阙慵归去,且插梅花醉洛阳。 ——朱敦儒 《鹧鸪天》 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder =[3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉...

kaggle expert,全球排名前1000,清华计算机研究生,兴趣算法工程 617

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

golang力扣leetcode 105.从前序与中序遍历序列构造二叉树

105.从前序与中序遍历序列构造二叉树105.从前序与中序遍历序列构造二叉树题解代码 105.从前序与中序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 题解 思路 preorder 根 左 右 inorder 左 根 右 1.找到根的位置 2.递归构造左子树和右子树 代码 func buildTree(preorder []int, inorder []int) *TreeNode { if len(preorder) == 0 { return nil } root := &a

清风 2546

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣 105 题:从前序与中序遍历序列构造二叉树

/ 定义二叉树节点结构体int val;

weixin_48941116的博客 900

精选力扣500题 第46题 LeetCode 105. 从前序与中序遍历序列构造二叉树【c++/java详细题解】

目录1、题目2、思路3、c++代码4、java代码 1、题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 2、思路 (递归) O(n)O(n)O(n) 二叉树前序遍历的顺序为:根左右 二叉树中序遍历的顺序为:左根右 递归建立整棵二叉树:先创

林深不见鹿 的博客 4138

【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

让前序的第一个元素作为中序的分割点。

weixin_44382896的博客 748

从前序与中序遍历序列构造二叉树-Leetcode 105-python

从前序与中序遍历序列构造二叉树-Leetcode 105 思路来自:https://blog.csdn.net/htt789/article/details/80164049 脑子不好使 思路: 1.前序序列第一个为根结点,在中序序列中找到该结点位置,中序序列就分为左右子树结点 2.前序序列除第一个结点,其余为左右子树结点,根据中序序列中左右子树各自的长度将前序序列划分了左右子树 3....

小铅笔 412

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

LeetCode 105. 从前序与中序遍历序列构造二叉树 题目链接 3 / \ 9 20 关于二叉树的遍历,其实有个比较好记的方法,假设有一个棵树,只有三个节点,左节点树,当前节点,右边节点。 假设需要打印中间节点(根节点),有三种输出方式 1.按照左、中、右, 9-3-20 由于中间节点在中间输出,称为前序遍历,同理 2.中、左、右 中序遍历 3-9-20 3.左、右、中 后续遍历 9-20-3 所以题目中的二叉树的遍历为 3 / \ 9 20 /

liuhao192的博客 274

Java题解LeetCode——105.从前序与中序遍历序列构造二叉树

LeetCode——105.从前序与中序遍历序列构造二叉树 题目 105.从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 解析 图来自LeetCode官方题解 递归创建。思路如上图: 通过前序数组来确定

影龙武的博客qq_43594119 714

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

leetcode105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 先看这么一颗...

peony的博客 183

LeetCode 105:从前序与中序遍历序列构造二叉树

目录LeetCode 105: 从前序与中序遍历序列构造二叉树题目描述解题递归迭代 LeetCode 105: 从前序与中序遍历序列构造二叉树 题目描述 根据一棵树的前序遍历与中序遍历构造二叉树。 【注意】 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 【难度】  中等 解题     思路和L

s_Shune 162

代码随想录算法训练营第16天|LeetCode112路径总和LeetCode113路径总和iiLeetCode106.从中序与后序遍历序列构造二叉树LeetCode105从前序与中序遍历序列构造二叉树

1、路径之和:与昨天的路径问题思路相似,前序递归每次遇到叶子结点时求路径之和并进行比较 2、数组构造二叉树 (1)前序数组的第一个元素为子树根节点,由于数组不可以从前端弹出元素,分割数组是通过指针移动实现的,不产生新的数组 (2)后续数组最后一个元素为子树根节点,分割数组产生新的数组。

2301_79647020的博客 1484

Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 class Solution { ...

南 墙 1万+
上一篇: LeetCode 56. 合并区间(排序
下一篇: LeetCode 139. 单词拆分(记忆化搜索 dp
RedemptionC
博客等级 码龄11年 103粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值