前端工程师leetcode算法面试必备-二叉树深度广度遍历

JavaScript实现二叉树广度优先遍历 创建二叉树结构 function TreeNode(val) { this.val = val; this.left = this.right = null; } let root = new TreeNode(1) let node2 = new TreeNode(2) let node3 = new TreeNode(3) let node4 = new TreeNode(4) let n... 阅读详情

一、前言

Medium 难度主要考察结合二叉树性质的 CRUD 操作,而这一切的基础都离不开遍历二叉树。

二叉树是图的子集,因而同样适用以下两种搜索思想:

  • **DFS(深度优先搜索):**沿着根节点递归下去,遇到叶子节点则向上回溯;

  • **BFS (广度优先搜索):**按照二叉树的层次访问,通常采用队列保存每个层次的节点。

由于二叉树本身的定义就是递归的,所以采用递归处理起来,代码更容易理解。但是递归的效率相对比较慢,主要原因在于:一个函数被调用的时间和空间成本开销很大,递归太多很可能导致调用栈溢出的问题。上一篇中也提到可以采用尾递归的书写方式,让 JavaScript 引擎去将递归优化成迭代,从而解决性能上的问题。

但是在一些情况下,尾递归并没有那么好写,所以本文会同时给出递归和迭代的解决方案。

接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。

二、102. 二叉树的层次遍历

给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。

1、BFS

这道题目要求按层次遍历节点,很符合 BFS 搜索思想的定义,所以代码也很好理解。

这里需要利用队列(queue)来保存每一层需要访问的节点,需要特别注意队列的特性是先进先出,而本题要求每一层从左到右遍历,所以需要先将左子树放入队列。

在这里插入图片描述

2、DFS

采用 DFS 搜索思想,需要注意在递归的过程中记录当前节点的层次信息:

在这里插入图片描述

三、145. 二叉树的后序遍历

给定一个二叉树,返回它的 后序 遍历。

二叉树中最常见的就是按照根节点访问次序定义的三种遍历方式:

  • 先序遍历:首先访问根,再先序遍历遍历左子树,最后先序遍历右子树;

  • 中序遍历:首先中序遍历左子树,再访问根,最后中序遍历右子树;

  • 后序遍历:首先后序遍历左子树,再后序遍历右子树,最后访问根;

以本道题的后序遍历为例,尝试递归和迭代两种不同的方法:

1、递归实现 DFS

从定义中,大家应该能够想象到递归的代码如何书写:

在这里插入图片描述

参考视频:传送门

2、迭代实现 DFS

本道题目采用迭代实现 DFS 不太容易理解,主要由于迭代不能像递归那样向上回溯,所以迭代向下遍历的过程中,无法保证根节点最后访问。

再回顾一下后序遍历最终得到的序列:

  左子树 --> 右子树 --> 根

如果必须先访问根节点,那么是不是可以得到这样的序列:

  根 --> 右子树 --> 左子树

最后,再将该序列反转,是不是就是本题所要求解的后序遍历!

这里我们利用栈后进先出的特性,将右子树最后推进栈,使得右子树先进行深度搜索:

在这里插入图片描述

四、987. 二叉树的垂序遍历

给定二叉树,按垂序遍历返回其结点值。对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值( Y 坐标递减)。如果两个结点位置相同,则首先报告的结点值较小。按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。

最后,通过本道题目来开启 Medium 难度题型的讲解。

这道题目要求我们求出垂序遍历序列,那么首先还是得先遍历二叉树,这里采用递归实现 DFS 来遍历二叉树。

在递归的过程中需要向下传递坐标信息,并且通过 HashTable 记录各个节点的三元组信息( x 坐标、y 坐标,节点值),以便后续构造垂序序列:

在这里插入图片描述

得到坐标之后,需要对三元组进行综合排序,最后再根据 x 坐标构造垂序遍历序列,时间复杂度 O(nlogn)。

在这里插入图片描述

写在最后

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

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

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

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结 广度优先搜索(BFS)在JavaScript编程中有许多实际应用场景,特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中,可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列,然后迭代地将节点的邻居节点加入队列,直到队列为空为止。这样可以逐层地遍历图或树结构,找到目标节点或满足条件的节点。在实际编程中,需要注意避免重复访问节点、处理环路等问题,确保算法的正确性和效率。上题:可以按照博主的列的题目顺序依次练习,二叉树的简单,图论的难,但是做题技巧比较固定。 阅读详情

相关推荐

掌握树的深度优先与广度优先遍历方法

深度优先搜索(DFS),顾名思义,是一种优先深入探索分支的遍历策略。它从一个节点开始,沿着树的分支向深处遍历,直到分支的末端,然后再回溯并探索其他分支。在遍历过程中,为了保持回溯的路径,通常会使用递归或显式的栈来记录访问路径。广度优先搜索(BFS)则采取不同的策略,它从根节点开始,先访问离根节点最近的节点,然后依次访问距离根节点较远的节点。这种遍历方式更像“层序遍历”,通常使用队列来实现,从队列前端取出节点并访问其未访问的邻居节点。深度优先遍历是图和树的遍历策略之一。

weixin_28888459的博客 1313

JS实现广度优先遍历

广度优先遍历,js,树形结构

m0_72572410的博客 1508

JavaScript树的深度优先遍历和广度优先遍历算法示例

主要介绍了JavaScript树的深度优先遍历和广度优先遍历算法,结合实例形式分析了JavaScript树的深度优先遍历、广度优先遍历递归与非递归相关实现技巧,需要的朋友可以参考下

JS实现二叉树的创建和遍历

1、先说二叉树的遍历,遍历方式:    前序遍历:先遍历根结点,然后左子树,再右子树    中序遍历:先遍历左子树,然后根结点,再右子树    后续遍历:先遍历左子树,然后右子树,再根结点 上代码:主要还是利用递归 function TreeCode() { let BiTree = function (ele) { this.data ...

395

STM32F407实现LwIP的MQTT客户端并连接到服务器

这个是用LwIP协议栈中自带的MQTT客户端API写成的,代码注释很详细,附带有服务端的展示。LwIP版本是2.1.2.

wait_for_STM32的博客 6396

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2740

JS算法 —— 二叉树的dfs(深度)和bfs(广度)遍历

目录一、二叉树二、dfs深度优先遍历三、bfs广度优先遍历(层次遍历) 一、二叉树 演示图 tree: const tree = { val: 1, left: { val: 2, left: null, right: { val: 4, left: null, right: { val: 7, left:

小绵杨 4979

如何用AP525 测试输入信号的相位,频响,延时,Pop和卡顿

假设信号不是从AP输出,是功放或者其他的播放设备输出的信号,接入到AP525的输入端。

帮助100万人颠覆负面潜意识,实现人生蜕变,培养1万名潜意识开发导师 2403

二叉树的遍历 js实现

二叉树主要有两种遍历方式:一是深度优先遍历,即先往二叉树底部走,遇到叶子节点再返回;二是广度优先遍历,即对二叉树的每一层逐层遍历节点。

qq_52046856的博客 1921

具身智能ACT模型在lerobot机械臂上的实践与优化

本文详细介绍了如何在低成本lerobot机械臂上实践与优化具身智能ACT模型。从环境搭建、数据采集到模型原理与代码实战,提供了完整的入门指南。重点分享了通过数据增强、混合开源数据集及模型微调等策略,有效提升模型在抓取放置任务中的泛化能力与鲁棒性,为机器人学习爱好者提供了宝贵的实战经验。

weixin_29081703的博客 169

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

js前端算法---树 深度优先遍历 广度优先遍历 实现

js前端算法---树 深度优先遍历 广度优先遍历 实现

qq_42619366的博客 1332

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1988

javascript中采用深度优先和广度优先遍历DOM树算法

javascript中采用深度优先和广度优先遍历DOM树算法

weixin_51431277的博客 1778

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1213

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JS 深度优先遍历与广度优先遍历 实现查找

在日常的开发工作中,牵扯到层级结构比较复杂的节点,如树形节点,级联选择器,这些都是牵扯到前端算法的遍历的;本文将介绍常用到的两种遍历方式:深度优先遍历和广度优先遍历 深度优先遍历:depth first search 广度优先遍历:breadth first search 1.示意图 通过两组示意图来明白什么叫做深度优先遍历和广度优先遍历 图一(深度遍历示意图) 深度遍历查找会按照图中绿色标注的数字去查找,就相当于是一条道走到黑,如果没有叶子节点的话,会再拐回来,回溯到上一个节点再搜索其余的,按

GodLoveMe的博客 2432

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...

js实现二叉树的遍历

前序 递归 非递归 中序 递归 非递归 后序 递归 非递归

程序媛的梦工厂 1415

SAP B1中文培訓教材_SDK

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

js算法的深度优先遍历和广度优先遍历

深度优先遍历实现方式1 //深度优先遍历方法 let tree = { id: '1', title: '节点1', children: [ { id: '1-1', title: '节点1-1' }, { id: '1-2', title: '节点1-2', children: [{ id: '2', title: '节点2'

峰会路转的博客 5274

JS二叉树的深度优先、广度优先实现代码

【代码】JS二叉树的深度优先、广度优先实现代码。

u013751625的博客 328

js实现深度优先遍历和广度优先遍历

提出需求 今天逛公司文档发现有一道面试题,有下面一个对象,通过深度优先遍历和广度优先遍历查找到某一个节点的值 var tree = { name: "中国", children: [ { name: "北京", children: [ { name: "朝阳群众", }, { name: "海淀区",

a253399414的博客 932

图的深度优先遍历和广度优先遍历

一、写在前面 图的深度优先遍历和广度优先遍历,也是我们必须要明白的算法。下面我们以有向图为了,来总结一下,图是如何做到深度优先遍历和广度优先遍历的。 使用数组表示如下所示 let graph = { 0: [1, 2], 1: [2], 2: [0, 3], 3: [3] } 二、深度优先遍历 const graph = require('./database') let set = new Set() //使用Set数据结构来保存已经访问了的node节点。 const dfs =

weixin_47450807的博客 2934

二叉树的深度优先遍历和广度优先遍历js代码实现

树的深度优先搜索和广度优先搜索,其实没了解过的时候,看见树就头晕,之后去搜了下,发现也不是什么困难的事情; 其实树的深度优先搜索指的是不按照层级的规律去便利,像前序便利,中序后序便利都是属于深度便利的方式; 树的广度便利就是按照层级关系,一层一层的进行便利; 树的深度便利中,先序中的先指的是根,先序就是根左右,中序是左根右,后序是左右根;下面举个代码 ????: //结构大概是这样,可以进行赋值 function TreeNode(value, left, right) { this.va

zoooo_的博客 1244
上一篇: 用javascript分类刷leetcode22.字典树(图文视频讲解)
下一篇: JavaScript刷LeetCode心得
js2030code
博客等级 码龄4年 4粉丝 97原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值