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

LeetCode题解--105. 从前序与中序遍历序列构造二叉树 1. 题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 //前序遍历 preorder = [3,9,20,15,7] //中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 2. 分析   &nbs... 阅读详情

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

题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

解题思路

前序、中序、后序三种遍历的结构中,其中可以确定一个唯一的二叉树的组合包括 (前序、中序)、(中序、后序)。该题是前序、中序确定一个二叉树,其中前序提供一个根节点,可以在中序中找到对应的位置,该元素又会把中序分成两个子数组,每个子数组又可以找到对应的前序子数组,递归下去,就可以找到每一个节点。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        // 数组是否为空
        if(preorder.size() == 0 || inorder.size() == 0){
            return NULL;
        }
		// 调用递归
        return build(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);
    }
    
    /*
    *递归函数:
    *参数从左至右依次是:前序、中序、前序左起点、前序尾部、中序左起点、中序尾部
    */
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int preLeft, int preRight, int inLeft, int inRight) {
        // 如果任何一个尾部的下标大于起点,直接返回
        if(preLeft > preRight || inLeft > inRight){
            return NULL;
        }

        // 建立一个新的树
        TreeNode* root = new TreeNode(preorder[preLeft]);

        // 定义一个变量,用于记录前序的元素在中序中的位置
        int index = inLeft;
        while(index <= inRight && preorder[preLeft] != inorder[index]){
            index++;
        }
        // 计算左子树的长度,通过尾部下标可以计算出来右子树的长度
        int len = index-inLeft;
        // 递归,查找左子树和右子树
        root->left = build(preorder, inorder, preLeft+1, preLeft+len, inLeft, inLeft+len-1);
        root->right = build(preorder, inorder, preLeft+len+1, preRight, inLeft+len+1, inRight);

        return root;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

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

相关推荐

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6177

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

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

yyh520025的博客 940

关于对鱼眼相机图片进行畸变校正的两种思路

鱼眼畸变主要表现为径向畸变(Radial Distortion),图像中心正常,边缘向外拉伸。畸变模型通常基于入射角θ\thetaθ(光线与光学轴夹角)和图像半径rrr的关系。等距投影(Equidistant Projection)rdfθrd​fθ,其中rdr_drd​为畸变图像半径,fff为焦距,θ\thetaθ为入射角。等立体角投影(Equisolid Angle Projection)rd2fsin⁡θ2rd​2fsinθ/2。

qq_45670407的博客 1543

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

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

wind_liang的博客 1586

Cadence 17.2配置CIS数据库报错?手把手解决ODBC驱动位数不匹配问题

本文详细解析了Cadence 17.2配置CIS数据库时常见的ODBC驱动位数不匹配问题,提供了从系统环境检查到分步解决方案的完整指南。重点解决32位应用程序与64位ODBC驱动之间的架构冲突,包含驱动安装、DSN配置及高级排查技巧,帮助电子工程师快速恢复设计环境。

play7的博客 970

三菱MC协议(MC/TCP):避坑指南|C#实现三菱MC协议:软元件(X/Y/M/D)读写与帧格式解析

核心避坑逻辑:MC协议的坑80%集中在“PLC配置”“地址编码”“字节序”,先解决这三点,通信就成功了一半;实战优先级:新手优先用开源库(Mitsubishi.MCProtocol),避免手动拼接帧格式的复杂坑;进阶再研究帧格式解析;排坑技巧:先Ping通→用调试助手验证→写C#代码,分层排查,不要混在一起找问题。掌握这些避坑技巧后,你可以轻松实现C#与三菱全系列PLC的稳定通信,满足工业场景中数据采集、设备控制等核心需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2187

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

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

lyh2004_08的博客 902

Spark Catalog详解

旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗?我:你应该静下心来好好把spark基础知识进行全面学习。实习生:难道spark有这功能,而我没有学习过?咋弄啊?我:学习一下Spark Catalog。实习生:啥是Catalog啊?Spark Catalog是Spark SQL中的一个元数据管理组件,它提供了一个集中化的存储和查询表、视图和函数的位置。

SunnyRivers 1813

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

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

2401_82472941的博客 812

[QMT量化交易小白入门]-二、如何用miniQMT获取沪深A股的板块列表、历史行情数据和实时行情数据

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 5649

PCL点云八叉树体素中心下采样,体素包含点索引提取

基于PCL octree实现点云八叉树计算,支持提取体素中心点进行点云下采样;根据任一点坐标,可以得到其在八叉树中的位置,输出对应体素内其余点的坐标或者索引

qq_48694523的博客 462

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

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

qq_40263592的博客 1577

EEMD算法原理及应用

本博客主要概括EEMD算法的背景、原理以及应用,利用EEEMD对信号进行分解,然后选择有用的IMF分量进行叠加以完成信号的重构,从而实现对信号降噪。本文配套的源代码见文中链接,可供大家免费下载。

总结论文中的算法并给出论文的复现代码 4万+

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

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

qwq_ovo_pwp的博客 1013

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

力扣 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. 从前序与中序遍历序列构造二叉树

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

liuhao192的博客 274

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

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

小铅笔 412

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 713

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

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

peony的博客 182

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 161

代码随想录算法训练营第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解题汇总(持续更新)
黑暗主宰
博客等级 码龄9年 72粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值