【面试经典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.hqwc.cn/news/257936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程调试Linux服务器上的代码

远程调试Linux服务器上的代码 首先我们的环境有本地环境还有研发环境&#xff0c;本地环境就是我们本地电脑上面的代码&#xff0c;而研发环境就是我们开发好一个功能&#xff0c;发到一个linux服务器上面的代码&#xff1b;但是有些时候&#xff0c;研发环境上面的代码可能会…

构造,析构,拷贝构造

1. 类的6个默认的成员变量 如果一个类中什么成员都没有,简称为空类,空类中什么都没有&#xff1f;并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。 注意&#xff1a;这里的“默认”和“缺省”的意思差不多&#xff0c;也就是你不写这6个函数&#…

Flask template+Vue +项目中include引入其他模版(其他模版也会用到vue)的使用探索

项目背景是&#xff1a;团队的历史项目&#xff0c;是flask tmeplate写的前段页面。然后我在一个页面A.html中引入了vue文件&#xff0c;使用了vueelement_ui技术。现在想在此A页面中插入另外一个页面B.html的内容&#xff08;试图tab分开&#xff09;&#xff0c;因为入口只有…

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况&#xff1a; 压根没安装下载了但没设为库或方法不对 大多数为第一种情况&#xff1a; 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…

免费的数据采集软件,最新免费的几款数据采集软件【2024】

在当今数字化时代&#xff0c;数据是企业决策和业务发展的关键。而如何高效获取数据成为许多企业和研究机构的关注焦点。本文将深入探讨数据采集软件的种类。帮助大家选择最适合自己需求的数据采集工具。 数据采集软件种类 在众多数据采集软件中&#xff0c;有一类强大而多样…

《一念关山》热度破万,爱奇艺古装赛道出尽风头

​刘诗诗重回古装剧、新式武侠公路片、质感细腻的镜头美学......看点满满的《一念关山》频频登上热搜&#xff0c;俘获了大批观众的心。 开播首日热度就刷新了爱奇艺2023年站内纪录&#xff0c;《一念关山》作为2023年爱奇艺在古装赛道的收官之作&#xff0c;口碑和热度兼收。…

RHEL网络服务器

目录 1.时间同步的重要性 2.配置时间服务器 &#xff08;1&#xff09;指定所使用的上层时间服务器。 (2&#xff09;指定允许访问的客户端 (3&#xff09;把local stratum 前的注释符#去掉。 3.配置chrony客户端 &#xff08;1&#xff09;修改pool那行,指定要从哪台时间…

LV.12 D24 陀螺仪实验 学习笔记

一、陀螺仪实验代码分析 设置GPB_2引脚和GPB_3引脚功能为I2C传输引脚 #include "exynos_4412.h"/****************MPU6050内部寄存器地址****************/#define SMPLRT_DIV 0x19 //陀螺仪采样率&#xff0c;典型值&#xff1a;0x07(125Hz) #define CONFIG 0x1A…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…

基于SpringBoot+Vue学生成绩管理系统前后端分离(源码+数据库)

一、项目简介 本项目是一套基于SpringBootVue学生成绩管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#xff0c;确…

为“异常”努力是值得的

异常是OO语言处理错误的方式,在C中&#xff0c;鼓励使用异常。侯捷再书中谈起异常&#xff0c;“十年前撰写“未将异常考虑在内的”函数是为一种美好实践&#xff0c;而今我们致力于写出“异常安全码”。”可见异常安全的重要。 说起异常安全&#xff0c;首先就要是异常的出现…

自定义GPTs的Actions 调用外部API测试 返回API的结果:成功

我的自定义GPT&#xff1a;https://chat.openai.com/g/g-sOqIFZgIy-superbrain 效果&#xff1a;chatGPT调用我的天气接口返回天气。 可以看见把json结果变成md格式(人方便阅读)了。与物理世界连接成功&#xff0c;太强大了。 我建的测试示例&#xff1a;https://3.wjsou.…