二叉树的这五种遍历方法你们都会了吗?
说在前面
🎈二叉树大家应该都很熟了吧,那二叉树的这五种遍历方式你们都会了吗?

以这一二叉树为例子,我们来看看不同遍历方式返回的结果都是怎样的。
前序遍历
前序遍历的顺序是:首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。
var preorderTraversal = function(root) {const res = [];const traversal = (r)=>{if (r === null) return;res.push(r.val); // 访问根节点traversal(r.left); // 遍历左子树traversal(r.right); // 遍历右子树};traversal(root);return res;
};
- 输出结果
[3,9,20,15,7]
中序遍历
中序遍历的顺序是:首先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
var inorderTraversal = function(root) {const res = [];const traversal = (r)=>{if (r === null) return;traversal(r.left); // 遍历左子树res.push(r.val); // 访问根节点traversal(r.right); // 遍历右子树};traversal(root);return res;
};
- 输出结果
[9,3,15,20,7]
后序遍历
后序遍历的顺序是:首先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。
var postorderTraversal = function(root) {const res = [];const traversal = (r)=>{if (r === null) return;traversal(r.left); // 遍历左子树traversal(r.right); // 遍历右子树res.push(r.val); // 访问根节点};traversal(root);return res;
};
- 输出结果
[9,15,7,20,3]
层序遍历
层序遍历按照从上到下、从左到右的顺序访问二叉树的所有节点。
以广度优先策略遍历节点的方法:
- 使用队列作为辅助数据结构。
- 按照节点的深度层次访问二叉树,从根节点开始,逐层向下。
var levelOrderTraversal = function(root) {const res = [];const queue = [root];if(!root) return [];while(queue.length > 0){const node = queue.shift();res.push(node.val);node.left && queue.push(node.left);node.right && queue.push(node.right);}return res;
};
- 输出结果
[3,9,20,15,7]
垂序遍历
对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。

二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。
在层序遍历的基础上记录每个数据所在的位置再重新进行排序即可。
var verticalTraversal = function (root) {const nodeList = [];const q = [{ node: root, row: 0, col: 0 }];//获取二叉树节点集合while (q.length) {const { node, row, col } = q.shift();nodeList.push({ val: node.val, row: row, col });if (node.left) q.push({ node: node.left, row: row - 1, col: col + 1 });if (node.right) q.push({ node: node.right, row: row + 1, col: col + 1 });}//对二叉树节点进行排序nodeList.sort((a, b) => {if (a.row === b.row && a.col === b.col) {return a.val - b.val;}return a.row - b.row;});//对二叉树节点进行分组const res = [[nodeList[0].val]];for (let i = 1; i < nodeList.length; i++) {if (nodeList[i].row !== nodeList[i - 1].row) {res.push([]);}res[res.length - 1].push(nodeList[i].val);}return res;
};
- 输出结果
[[9],[3,15],[20],[7]]
公众号
关注公众号『前端也能这么有趣』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。
相关文章:
二叉树的这五种遍历方法你们都会了吗?
说在前面 🎈二叉树大家应该都很熟了吧,那二叉树的这五种遍历方式你们都会了吗? 以这一二叉树为例子,我们来看看不同遍历方式返回的结果都是怎样的。 前序遍历 前序遍历的顺序是:首先访问根节点,然后递归地…...
使用模数转换器的比例电阻测量基础知识
A/D 转换器是比率式的,也就是说,它们的结果与输入电压与参考电压的比值成正比。这可用于简化电阻测量。 测量电阻的标准方法是让电流通过电阻并测量其压降 (见图 1)。然后,欧姆定律(V I x R) 可用于计算电压和电流的…...
(C++语言的设计和演化) C++的设计理念
文章目录 前言📖C 语言设计规则📐规则和原理📐一般性规则📐设计支持规则📐语言的技术性规则📐低级程序设计支持规则 📖标准化(扩充评判准则)📐它精确吗&#…...
AI音乐:创新引擎还是创意终结者?
✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点赞、关注、收藏、评论,是对我最大…...
20240621每日后端---------如何优化项目中的10000个if-else 语句?
如何优化 10000 个 if-else 语句?有没有好的解决方案? 额,本身问题就很奇怪,怎么可能有这种代码。。。世界你让我陌生,但是我们还是假象着看看能不能解决一下。 解决方案1:策略模式 使用策略模式确实可以…...
【STM32】时钟树系统
1.时钟树简介 1.1五个时钟源 LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 LSE是低速外部时钟,接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。 HSE是高速外部时钟,可接石英*/陶瓷谐振…...
docker换源
文章目录 前言1. 查找可用的镜像源2. 配置 Docker 镜像源3. 重启 Docker 服务4. 查看dock info是否修改成功5. 验证镜像源是否更换成功注意事项 前言 在pull镜像时遇到如下报错: ┌──(root㉿kali)-[/home/longl] └─# docker pull hello-world Using default …...
百度在线分销商城小程序源码系统 分销+会员组+新用户福利 前后端分离 带完整的安装代码包以及搭建部署教程
系统概述 百度在线分销商城小程序源码系统是一款集分销、会员组管理和新用户福利于一体的前后端分离的系统。它采用先进的技术架构,确保系统的稳定性、高效性和安全性。该系统的前端基于小程序开发,为用户提供了便捷的购物体验和交互界面。用户可以通过…...
Flutter【组件】富文本组件
简介 flutter 富文本组件。 github地址: https://github.com/ThinkerJack/jac_uikit pub地址:https://pub.dev/packages/jac_uikit 使用方式 运行 flutter pub add jac_uikit组件文档 使用方式: HighlightedTextWidget.builder(text: &…...
中国恋爱交友相亲软件有哪些?大型婚恋相亲交友APP真实测评推荐
嘿嘿,当了29年的单身汪,这下总算不再单着啦!这两年把身边能找的人都找遍了,也没碰到合适的。没办法,就跑到网上去试试,坚持了有半年,可算有对象啦!下面给大家说说我用过的几个能脱单…...
快速欧氏聚类与普通欧氏聚类比较
1、前言 文献《FEC: Fast Euclidean Clustering for Point Cloud Segmentation》介绍了一种快速欧氏聚类方法,大概原理可以参考如下图,具体原理可以参考参考文献。 2、时间效率比较:快速欧氏聚类VS普通欧氏聚类 网上搜集的快速欧式聚类,与自己手写的普通欧式聚类进行对比,…...
如何让大语言模型在规格普通的硬件上运行 - 量化技术
近年来,大型语言模型(LLMs)的能力有了飞跃式的发展,使其在越来越多的应用场景中更加友好和适用。然而,随着LLMs的智能和复杂度的增加,其参数数量,即权重和激活值的数量也在增加,这意…...
shell printf详解
默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。 1. printf命令语法组成: printg format-string [arguments] 第一部分为格式化字符串,该字符串最好用引号括起来 第二部分为参数列表,例如字符串或变量值的列表,该列表需…...
【数据分析】用Python做事件抽取任务-快速上手方案
目录 方法一:使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二:使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理(NLP)领域,事件抽取是一项关键任…...
B端系统门门清之:HRM,人力资源系统,公司发展的源动力。
人才是公司发展的源动力,针对公司复杂人力的管理就是HRM系统的核心功能,本文就带领大家详细认识一下HRM系统,分别从什么是HRM系统,作用、功能模块、颜值提升四个方面来阐述。欢迎大家点赞评论收藏转发。 一、什么是HRM系统 HRM系…...
tplink安防监控raw文件转码合成mp4的方法
Tplink(深圳普联)专业的网络设备生产商,属于安防监控市场的后来者。Tplink的安防产品恢复了很多,其嵌入式文件系统也一直迭代更新。今天要说的案例比较特殊,其不仅仅要求恢复,还要求能解析出音频并且要求画面和声音实现“同步”。…...
每天一个数据分析题(三百八十三)- 聚类
关于忽略自相关可以带来什么问题描述错误的是? A. 均方误差可能严重低估误差项的方差 B. 可能导致高估检验统计量t值,致使本不显著的变量变得显著了 C. 参数估计值的最小方差无偏性不再成立 D. 参数估计值的最小方差无偏性仍成立 数据分析认证考试介…...
构建下一代数据解决方案:SingleStore、MinIO 和现代 Datalake 堆栈
SingleStore 是专为数据密集型工作负载而设计的云原生数据库。它是一个分布式关系 SQL 数据库管理系统,支持 ANSI SQL,并因其在数据引入、事务处理和查询处理方面的速度而受到认可。SingleStore 可以存储关系、JSON、图形和时间序列数据,以满…...
【经验分享】Ubuntu24.04安装微信
【经验分享】Ubuntu24.04安装微信(linux官方2024universal版) 文章如下,22.04和24.04微信兼容 【经验分享】Ubuntu22.04安装微信(linux官方2024universal版) 实测Ubuntu24.04LTS版本可以兼容。...
AXI学习笔记
文章目录 AXI口诀:AXI三种总线,三种接口,一个协议背景知识一、 AMBA:二、AXI2.1 通信协议与握手机制2.2 AXI协议特点2.3 三种AXI总线类型(AXI4、AXI4-lite、AXI4-stream)2.3.1 AXI通道(5通道&am…...
终极指南:AutoDock Vina如何轻松处理含金属元素的分子对接难题
终极指南:AutoDock Vina如何轻松处理含金属元素的分子对接难题 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 你是否曾在使用AutoDock Vina进行分子对接时,遇到"Atom type Pd i…...
OBS高级计时器:提升直播专业度的时间管理工具
OBS高级计时器:提升直播专业度的时间管理工具 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 在直播行业竞争日益激烈的今天,精准的时间控制是提升直播质量的关键因素之一。OBS高级计时器…...
深度解析:汇率结算下的货代对账困局,如何利用 AI 与 RPA 构建底层逻辑?
【前言】在国际物流与货运代理行业,财务对账向来是一块“硬骨头”。尤其是涉及跨国业务时,汇率的实时波动与多币种结算的交叉影响,使得原本复杂的账目核对工作呈几何倍数增加。传统的人工对账模式不仅效率低下,且在面对分位数的四…...
《QGIS快速入门与应用基础》240:指北针旋转与大小调整
作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...
借助yakit高效构建渗透字典:从历史流量中智能提取关键参数
1. 为什么需要从历史流量中提取渗透字典? 做过渗透测试的朋友都知道,字典的质量直接影响测试效率。传统方式要么用现成的通用字典,要么手动收集整理,前者命中率低,后者耗时费力。我遇到过最头疼的情况是测试一个Web系统…...
基于Coqui TTS的高质量语音合成实战:从模型部署到生产环境优化
最近在做一个需要语音播报功能的小项目,之前用的一些在线TTS服务,要么费用不低,要么音质和速度达不到要求。于是把目光投向了开源方案,一番折腾后,发现 Coqui TTS 真是个宝藏。它不仅音质好,支持的语言和声…...
别再只用Cesium了!Three.js + Cesium 1.8 整合实战:从零搞定天地图中文底图与BIM模型加载
Three.js与Cesium 1.8深度整合实战:天地图中文底图与BIM模型加载全解析 当我们需要在三维地理信息系统中同时展示宏观地理环境和精细建筑内部结构时,单独使用Cesium或Three.js往往难以完美兼顾。本文将带你完成一次技术栈的深度整合,解决国内…...
springboot汽车配件商城销售管理系统
目录系统架构设计数据库设计核心功能实现销售管理模块库存预警功能报表统计模块系统测试策略部署方案项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用SpringBoot作为后端框架,搭配MyBatis或JPA实现…...
告别风扇噪音与过热:FanControl智能控温完全指南
告别风扇噪音与过热:FanControl智能控温完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…...
Elasticsearch-03-kNN算法
Elasticsearch-03-kNN算法详解 概述 Elasticsearch提供了强大的k近邻(k-Nearest Neighbors, kNN)搜索功能,支持两种实现方式:暴力搜索和近似搜索。本文档将详细介绍这两种kNN算法的原理、优缺点和适用场景。 1. 暴力搜索ÿ…...
