【面试经典150 | 二叉树】从前序与中序遍历序列构造二叉树

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:递归
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【递归】【迭代】【二叉树】


题目来源

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


题目解读

给你一棵二叉树的前序和中序遍历得到的两个数组,现在根据两个数组来构造二叉树。


解题思路

二叉树问题都可以使用递归和迭代两种方法来解决。

方法一:递归

前言

首先回忆一下二叉树的前序和中序遍历过程。

二叉树的前序遍历过程:

  • 先遍历根节点;
  • 接着递归遍历左子树;
  • 最后递归遍历右子树。

二叉树的中序遍历过程:

  • 先递归遍历左子树;
  • 接着遍历根节点;
  • 最后递归遍历右子树。

在「递归」遍历子树的过程中,我们也是将子树看成是一棵全新的树,按照相应的顺序进行遍历。

思路

根据上述提到的前序遍历顺序可以将 preorder 数组分为三部分,根、左子树、右子树。目前仅通过先序遍历的结果数组可以确定的是根节点值为 3。

中序遍历的结果数组可以分为三部分:左子树、根、右子树。

只要我们在中序遍历的结果数组中定位出根节点,那么就可以分别知道左子树和右子树的数目,进而可以定位出左、右子树的边界即在数组中的范围。这样就知道了左子树的前序遍历和中序遍历结果,以及右子树的前序遍历和中序遍历结果,就可以递归地对构造出左子树和右子树,再将这两棵子树接到根节点的左右位置。

在定位根节点的时候,利用哈希表来记录各个节点在数组中的位置,因为题目中事先说明了二叉树中节点的值不会出重复。哈希表中的键表示一个元素的值,值表示该键表示的值在中序遍历数组中的位置。

算法

class Solution {
private:
    int pre_idx;
    unordered_map<int, int> index_map;
public:
    TreeNode* slove(const vector<int>& preorder, const vector<int>& inorder, int in_left, int in_right) {
        if (in_left > in_right) {
            return nullptr;
        }
        // 前序遍历中的根节点
        int root_val = preorder[pre_idx++];
        // 建立根节点
        TreeNode* root = new TreeNode(root_val);
        // 在中序遍历中定位根节点
        int idx = index_map[root_val];
        
        // 递归构建左子树,需要左子树的先序、中序的边界
        root->left = slove(preorder, inorder, in_left, idx - 1);
        root->right = slove(preorder, inorder, idx + 1, in_right);
        return root;

    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = inorder.size();
        pre_idx = 0;
        // 构建哈希表,快速定位根节点
        for (int i = 0; i < n; ++i) {
            index_map[inorder[i]] = i;
        }
        return slove(preorder, inorder, 0, n-1);
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n),其中 n n n 是树中的节点个数。

空间复杂度: O ( n ) O(n) O(n)。返回的答案需要 O ( n ) O(n) O(n) 空间,通过不算作占用额外的空间;哈希表占用的额外空间为 O ( n ) O(n) O(n);递归的栈空间最大为 O ( n ) O(n) O(n)。因此,总的空间复杂度为 O ( n ) O(n) O(n)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/228590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java数字化健康卫生智慧云HIS系统源码

基于云计算技术的B/S架构云HIS集挂号、处方、收费、取药、病历于一体,完全适配各类中小型医院、诊所。 一、云 HIS定义 1、云 HIS 系统是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生…

软文营销全过程分享,助力企业提高宣传效率

数字化时代下&#xff0c;软文营销已经成为许多企业推广品牌的手段&#xff0c;但是在营销过程中大部分企业认为只需要写好文章进行发布就够了&#xff0c;这其实是错误的&#xff0c;只会浪费企业的时间精力。今天媒介盒子就分享软文营销全过程&#xff0c;助力企业提高宣传效…

cpu 300% 爆满 内存占用不高 排查

top查询 cpu最高的PID ps -ef | grep PID 查看具体哪一个jar服务 jstack -l PID > ./jstack.log 下载/打印进程的线程栈信息 可以加信息简单分析 或进一步 查看堆内存使用情况 jmap -heap Java进程id jstack.log 信息示例 Full thread dump Java HotSpot(TM) 64-Bit Se…

SpringMVC 案例

文章目录 前言1. 计算器1.1 准备前端代码1.2 测试前端代码1.3 完成后端代码1.4 验证程序 2. 留言板2.1 前端代码准备2.2 测试前端代码2.3 完成前后端交互代码2.4 完成后端代码2.5 案例测试2.6 完善前后端交互2.7 完善后端代码2.8 完整功能测试 lombok简单的方式添加Lombok工具3…

小视频怎么做成二维码?视频二维码3步生成

在日常工作和生活中经常会看到各种类型的小视频、短视频&#xff0c;比如网页、抖音等等的视频都是可以下载查看的。当我们想要将下载视频分享给多个人看时&#xff0c;生成二维码的方式会更加的方便&#xff0c;那么视频如何生成二维码呢&#xff1f;下面就将快捷生成二维码的…

spring boot 3.2 整合 keycloak

背景 项目中用到 keycloak&#xff0c;因此其他所有管理页面要集成 keycloak 做统一登录认证。 Keycloak 侧配置 容器方式启动 keycloak 服务端 docker run -d --name mykeycloak -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin ke…

LeetCode 每日一题 Day 6(DFS+BFS)

1466. 重新规划路线 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变…

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…

优秀案例 | 元宇宙双语财经科技主播“舒望”主持首届粤港澳大湾区元宇宙国际传播论坛

12月6日&#xff0c;由南方财经全媒体集团指导、大湾区元宇宙国际传播实验室(GBA MIC Lab&#xff09;主办、南财国际传播中心和21世纪经济报道共同承办&#xff0c;以“多元共创开放共享”为主题的首届粤港澳大湾区元宇宙国际传播论坛在广州隆重开幕。 “立足湾区&#xff0c;…

【GEE笔记】随机森林特征重要性计算并排序

随机森林是一种基于多个决策树的集成学习方法&#xff0c;可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器&#xff0c;并用它来对影像进行分类。 随机森林分类器有一个重要的属性&#xff0c;就是可以计算每个特征&a…

【沁恒蓝牙MESH】CH582串口中断内存溢出导致MCU频繁重启

本文主要记录了【沁恒蓝牙mesh】CH582串口中断内存溢出导致MCU频繁重启 由于开发疏忽&#xff0c;导致的数组内存溢出&#xff0c;是入门嵌入式开发经常忽视的错误&#xff0c;用以记录&#xff0c;共勉&#xff01;&#xff01; 目录 1. 遇到问题描述以及解决1.1 问题一&#…

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

都2023年了还在搜索Maven是什么?赶紧来学习(超详细一文搞懂)

文章目录 前言1. 到底什么是 Maven2. 为什么要学Maven3. 创建一个 Maven 项目4. Maven 核心功能4.1 项目构建4.2 依赖管理 4. Maven 仓库4.1 本地仓库4.2 中央仓库4.3 私有服务器, 也称为私服 5. Maven 设置国内源5.1 配置当前项目setting5.2 设置新项目的setting 总结 前言 我…

N4694D 电子校准件(ECal),67 GHz,1.85 mm,2 端口

N4694D 电子校准件 Keysight N4694D 微波电子校准件&#xff08;ECal&#xff09;可以快速、轻松和准确地对是德科技矢量网络分析仪进行校准。 N4694D 是一款精密型 2 端口电子校准件&#xff0c;支持 1.85 mm 连接器和高达 67 GHz 的频率范围。 用户可以在阴头-阴头、阳头-阳头…

低代码开发:激发创新还是程序员的末日?

前言 近年来&#xff0c;低代码开发备受关注&#xff0c;引发了市场上的热议。这一新兴技术被标榜为具备低门槛、高效率和易集成等特性&#xff0c;然而&#xff0c;却引发了一系列的争论。究竟低代码是伪需求还是行业创新的助推器&#xff1f;它是否可能让程序员失业&#xf…

电脑报错msvcr100.dll丢失?竟有5种解决方法,全面解析

在计算机的使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是msvcr100.dll丢失。这个问题主要出现在基于Microsoft Visual Studio 2010开发的程序上&#xff0c;可能导致程序无法正常运行。本文将详细介绍msvcr100.dll是什么&#xff0c;以及如何解决其丢…

强制使用新版,Win11里隐藏的Win10要没了

系统这玩意和游戏一样&#xff0c;在许多人眼中「上一代」永远是最好的一代。 除了尝鲜测试阶段必然出现许多 Bug &#xff0c;另一个原因大概是好不容易建立的使用习惯又被打破。 Win10 到 11 的换代即是如此&#xff0c;就算不提稳定性&#xff0c;也还有一些让人至今难以适…

企业贷款行业如何获客?

贷款行业是指提供贷款服务的行业&#xff0c;包括各种类型的金融机构&#xff0c;如银行、信用社、贷款公司、保险公司等。这些机构通过向个人或企业提供贷款服务&#xff0c;满足其资金需求。 主要分为个人贷款和企业贷款。个人贷款指银行或其他金融机构向符合贷款条件的自然…

MS5228/5248/5268:2.7V 到 5.5V、 12/14/16Bit、内置基准、八通道数模转换器

MS5228/MS5248/MS5268 是一款 12/14/16bit 八通道输出的电压型 DAC &#xff0c;内部集成上电复位电路、可选内部基准、接口采用四线串口模式&#xff0c; 最高工作频率可以到 40MHz &#xff0c;可以兼容 SPI 、 QSPI 、 DSP 接口和 Microwire 串口。输出接到一个 …
最新文章