前端工程师leetcode算法面试必备-二叉树的构造和遍历

news2024/10/5 15:38:45

一、前言

上一篇中介绍了如何采用 DFS 和 BFS 的搜索思想去实现二叉树的前序遍历、中序遍历、后序遍历以及分层遍历。

这一节主要介绍 Medium 难度中比较常见的一种题型:根据各种遍历构造二叉树

二、1008. 先序遍历构造二叉树

返回与给定先序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点

本道题目要求构造一棵 BST,使得它的前序遍历序列与给定的 preorder 匹配。

首先,对二叉树进行前序遍历,可以得到如下序列:

  根节点 --> 左子树 --> 右子树

显然,根据前序序列,可以确定第一个元素就是根节点,那么接下来的问题就是如何找到左右子树的分割点?

回忆一下 BST 的特性:

  • 左子树的元素都比根元素小;

  • 右子树的元素都比根元素大;

  • BST 中不存在重复的元素;

结合上述性质:通过根节点与序列中元素的大小比较可以得到左右子树的分割点

在这里插入图片描述

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

根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。

本道题目要求构造一棵普通的二叉树,而非 BST。

  前序遍历:根节点 --> 左子树 --> 右子树

  中序遍历: 左子树 --> 根节点 --> 右子树

从上述两个遍历序列中,大家应该已经发现分割左右子树的条件就藏在中序遍历中。

根据前序遍历得到根元素,再遍历中序遍历序列得到根元素的下标,从而分割左右子树。如果二叉树中存在重复元素,那么这种方案是行不通的,这也是此类型题目一个重要的条件。

在这里插入图片描述

四、106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。

本题的解题思路与上一道题的解题思路如出一辙,所以正好借用本道题目介绍一下时间复杂度的优化。

上一题解题代码的耗时操作主要在于频繁地使用 shift、indexOf 和 slice。

对于 indexOf 操作,可以采用 HashTable 代替,这是经典的空间换时间的优化方式。

而对于 shift 和 slice,可以采用多指针记录下标来处理。这里的下标计算有点复杂,建议大家自己画一画遍历的过程,不然很难明白写法的推导过程。

在这里插入图片描述

五、889. 根据前序和后序遍历构造二叉树

返回与给定的前序和后序遍历匹配的任何二叉树。pre 和 post 遍历中的值是不同的正整数。

还是老套路,先观察两个遍历序列:

  前序遍历:根节点 --> 左子树 --> 右子树

  后序遍历:左子树 --> 右子树 --> 根节点

这不是熟悉的感觉啊,看来看去,根节点也不好将左右子树分割啊!?

现在,尝试展开左右子树:参考视频:传送门

  前序遍历:根节点 --> (根节点 --> 左子树 --> 右子树) --> 右子树

  后续遍历:(左子树 --> 右子树 --> 根节点) --> 右子树 --> 根节点

是不是有点明朗了,再把左右根节点去掉,是不是发现根据左子树的根节点,可以将左右子树分割开呀。

  前序遍历:(根节点 --> 左子树 --> 右子树) --> 右子树

  后续遍历:(左子树 --> 右子树 --> 根节点) --> 右子树

在这里插入图片描述

写在最后

算法作为计算机的基础学科,用 JavaScript 刷,一点也不丢人ε=ε=ε=┏(゜ロ゜;)┛。

本系列文章会分别给出一种算法的3种难度的总结篇(简单难度,中等难度以及困难难度)。在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。

如果本文对您有所帮助,可以点赞或者关注来鼓励博主。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022阅读数据分析报告

零、前言 晃晃悠悠,又至年尾。翻阅新的书籍五十有余,得到读书和樊登讲书,累计或许在千余小时,或跑步,或骑行,或徒步,偶或地铁,都做耳旁音。回首年初扶起的flag,细思存量不存质。暂且延续2021年的阅读记录方式1,简单可视化本年阅读数据,收尾第二年的阅读小结。 图1 年…

WeNet开源社区介绍

本文是由张彬彬在第二届SH语音技术研讨会和第七届Kaldi技术交流会上对WeNet开源社区的一些工作上的整理,内容涵盖了 WeNet 的最新进展、新项目WeKws,WeSpeeker和WeTextProcessing的介绍,以及去年发布的两个数据集Opencpop和WenetSpeech在今年…

11矩阵空间、秩1矩阵

矩阵空间 知识概要 ​ 从矩阵空 间谈起,介绍矩阵空间的维数,基等问题。渗透一些微分方程与线性代数之间的 联系,并介绍秩为 1 的矩阵特点。 矩阵空间 对角阵D不是很理解。 (1)基与维数 再看对角阵 D,明…

Hudi学习03 -- Spark操作hudi(Spark-shell 和 PySpark)

文章目录Spark环境准备Spark-shell 方式启动命令,需要显示指定一些参数插入数据查询数据时间旅行(Time Travel Query)更新数据增量查询(Incremental query)删除数据(Delete Data)覆盖分区数据&a…

阴道菌群——贯穿女性一生

阴道微生物组是一个复杂而动态的微生态系统,在女性月经周期和女性的一生中不断发生波动。 在过去几年中,对阴道微生物群关注随着测序技术的发展和应用逐渐广泛和突出,有关以往传统正常和异常阴道微生物组的知识也发生了变化。培养技术可能不再…

Bandit算法学习[网站优化]01——Multiarmed Bandit 算法引入

Bandit算法学习[网站优化]01——Multiarmed Bandit 算法引入 参考资料 White J. Bandit algorithms for website optimization[M]. " O’Reilly Media, Inc.", 2013.https://github.com/johnmyleswhite/BanditsBookeasy-rl 一、探索与利用(exploration…

Next.js i18n国际化实现方案(支持ReactNode类型、可传参)

前言 抛开Next.js框架不谈,想必其他项目也经常会遇到国际化方案,大概逻辑都是差不多的,只是说这次本人碰巧在Next上的项目有这样的需求,并记录下来。 实现思路: 其实不从代码角度上讲的话,无非是引入一个…

【王道操作系统】3.1.6 分页存储(页号、页偏移量等)

分页存储(页号、页偏移量等) 文章目录分页存储(页号、页偏移量等)1.为什么学习分页存储2.基本分页存储管理的思想3.分页存储管理的重要概念4.如何实现地址的转换4.1 如何计算页号和页偏移量4.2 分页存储的逻辑结构4.3 如何知道页面在内存中的起始地址1.为什么学习分页存储 2.基…

Qt扫盲-QSS语法概述

QSS语法概述一、语法规则二、选择器类型三、子控件四、伪态五、冲突解决六、样式层叠七、样式继承八、含命名空间样式设置九、QObject 属性设置概述:QSS也叫Qt样式表,Qt样式表术语和语法规则几乎与HTML CSS的术语和语法规则相同。如果已经了解CSS&#x…

【Vue2+Element ui通用后台】整体布局、数据展示、axios封装

文章目录Home组件表格Axios封装Home组件 我们新建 Home 组件来展示右侧的内容 整体布局我们使用layout布局,通过基础的 24 分栏,迅速简便地创建布局。由于左侧占比较小,我们分为 8 和 16 即可 然后每个卡片样式的部分,我们使用…

flask session机制

信息收集 主页是一个登陆界面其他按钮点击不了,源代码也没什么东西。 除了admin用户不能直接登陆,其他用户都可以。 打开以后是一个文件上传,然后根据提示只能上传zip文件,我们随便上传一个 我在zip文件里面写了一个/etc/passw…

prometheus监控报警部署Alertmanager

Prometheus将告警分为两个部分:Prometheus 和 Alertmanager。其中Prometheus配置告警触发规则,对指标进行监控和计算,将再将告警信息发送到Alertmanager中。Alertmanager对告警进行管理,比如合并抑制等操作。 wget https://github…

10.移动端笔记-响应式布局

1.响应式开发 原理:使用媒体查询针对不同宽度的设备进行布局和样式设置,从而适配不同的设备 2.响应式布局容器 响应式需要一个父级做为布局容器,配合子级元素实现变化效果 原理:在不同屏幕下,通过媒体查询改变这个…

HAProxy的安装

1、将HAProxy上传到opt目录下 2、 解压到/usr/local/src tar -xvf haproxy-1.5.18.tar.gz -C /usr/local/src 3、进入解压后的目录,查看内核版本,进行编译 cd /usr/local/src/haproxy-1.5.18 uname -r make TARGETlinux310 PREFIX/usr/local/haproxy …

Keil MDK 配置详解与调试技术

工程配置介绍① 通用配置选项;② 操作系统选项;③ 勾选后可以减小镜像尺寸,加快运行速度;④ 浮点配置;⑤ 加载简要配置,分散加载情况需要配置;编译器输出选项;可执行…

今年你拿到了几个月的年终奖?

近期听到最多的三个消息:阳了 、 裁员 、 年终奖。 今年无疑是非常艰难的一年,无论国内还是国外裁员貌似从年初到年末从未停止过,加上疫情放开之后,大部分人都加入了羊群的行列,让我们的生活雪上加霜。 腾讯今年也陆…

结构化分析方法

目录 1.概述 2.数据流图 3.结构图 4.一个例子 4.1.需求 4.2.数据流图 4.3.结构图 5.辅助工具 5.1.数据字典 5.2.加工说明 1.概述 结构化方法是世界上第一个软件开发方法学,用来指导从需求分析、到设计开发各个阶段该怎么样做,采用什么样的方法…

ubuntu22.04搭建qemu环境测试内核

ubuntu22.04搭建qemu环境测试内核安装qemu创建qemu目录编译内核编译文件系统启动qemu安装qemu sudo apt-get install qemu krokodilkrokodil-SY-ZL-H110N-D3V:~/workspace$ dpkg -l | grep qemu ii ipxe-qemu 1.21.1git-20220113.fbbdc392…

R语言GD包基于栅格图像实现地理探测器与连续参数的自动离散化

本文介绍基于R语言中的GD包,依据栅格影像数据,实现自变量最优离散化方法选取与执行,并进行地理探测器(Geodetector)操作的方法。 首先,在R语言中进行地理探测器操作,可通过geodetector包、GD包等…

Qt扫盲-QSS概述

QSS概述一、概述二、详细一、概述 QSS 其实是Qt样式表,Qt样式表是Qt界面的一种强大的机制,除了通过继承QStyle已经可以实现的功能外,它还允许您自定义窗口组件的外观。Qt样式表的概念、术语和语法很大程度上受到HTML层叠样式表(CSS)的启发。…