当前位置: 首页 > news >正文

二叉树的这五种遍历方法你们都会了吗?

说在前面

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

以这一二叉树为例子,我们来看看不同遍历方式返回的结果都是怎样的。

前序遍历

前序遍历的顺序是:首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。

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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

相关文章:

二叉树的这五种遍历方法你们都会了吗?

说在前面 &#x1f388;二叉树大家应该都很熟了吧&#xff0c;那二叉树的这五种遍历方式你们都会了吗&#xff1f; 以这一二叉树为例子&#xff0c;我们来看看不同遍历方式返回的结果都是怎样的。 前序遍历 前序遍历的顺序是&#xff1a;首先访问根节点&#xff0c;然后递归地…...

使用模数转换器的比例电阻测量基础知识

A/D 转换器是比率式的&#xff0c;也就是说&#xff0c;它们的结果与输入电压与参考电压的比值成正比。这可用于简化电阻测量。 测量电阻的标准方法是让电流通过电阻并测量其压降 &#xff08;见图 1&#xff09;。然后&#xff0c;欧姆定律(V I x R) 可用于计算电压和电流的…...

(C++语言的设计和演化) C++的设计理念

文章目录 前言&#x1f4d6;C 语言设计规则&#x1f4d0;规则和原理&#x1f4d0;一般性规则&#x1f4d0;设计支持规则&#x1f4d0;语言的技术性规则&#x1f4d0;低级程序设计支持规则 &#x1f4d6;标准化&#xff08;扩充评判准则&#xff09;&#x1f4d0;它精确吗&#…...

AI音乐:创新引擎还是创意终结者?

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…...

20240621每日后端---------如何优化项目中的10000个if-else 语句?

如何优化 10000 个 if-else 语句&#xff1f;有没有好的解决方案&#xff1f; 额&#xff0c;本身问题就很奇怪&#xff0c;怎么可能有这种代码。。。世界你让我陌生&#xff0c;但是我们还是假象着看看能不能解决一下。 解决方案1&#xff1a;策略模式 使用策略模式确实可以…...

【STM32】时钟树系统

1.时钟树简介 1.1五个时钟源 LSI是低速内部时钟&#xff0c;RC振荡器&#xff0c;频率为32kHz左右。供独立看门狗和自动唤醒单元使用。 LSE是低速外部时钟&#xff0c;接频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。 HSE是高速外部时钟&#xff0c;可接石英*/陶瓷谐振…...

docker换源

文章目录 前言1. 查找可用的镜像源2. 配置 Docker 镜像源3. 重启 Docker 服务4. 查看dock info是否修改成功5. 验证镜像源是否更换成功注意事项 前言 在pull镜像时遇到如下报错&#xff1a; ┌──(root㉿kali)-[/home/longl] └─# docker pull hello-world Using default …...

百度在线分销商城小程序源码系统 分销+会员组+新用户福利 前后端分离 带完整的安装代码包以及搭建部署教程

系统概述 百度在线分销商城小程序源码系统是一款集分销、会员组管理和新用户福利于一体的前后端分离的系统。它采用先进的技术架构&#xff0c;确保系统的稳定性、高效性和安全性。该系统的前端基于小程序开发&#xff0c;为用户提供了便捷的购物体验和交互界面。用户可以通过…...

Flutter【组件】富文本组件

简介 flutter 富文本组件。 github地址&#xff1a; https://github.com/ThinkerJack/jac_uikit pub地址&#xff1a;https://pub.dev/packages/jac_uikit 使用方式 运行 flutter pub add jac_uikit组件文档 使用方式&#xff1a; HighlightedTextWidget.builder(text: &…...

中国恋爱交友相亲软件有哪些?大型婚恋相亲交友APP真实测评推荐

嘿嘿&#xff0c;当了29年的单身汪&#xff0c;这下总算不再单着啦&#xff01;这两年把身边能找的人都找遍了&#xff0c;也没碰到合适的。没办法&#xff0c;就跑到网上去试试&#xff0c;坚持了有半年&#xff0c;可算有对象啦&#xff01;下面给大家说说我用过的几个能脱单…...

快速欧氏聚类与普通欧氏聚类比较

1、前言 文献《FEC: Fast Euclidean Clustering for Point Cloud Segmentation》介绍了一种快速欧氏聚类方法,大概原理可以参考如下图,具体原理可以参考参考文献。 2、时间效率比较:快速欧氏聚类VS普通欧氏聚类 网上搜集的快速欧式聚类,与自己手写的普通欧式聚类进行对比,…...

如何让大语言模型在规格普通的硬件上运行 - 量化技术

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的能力有了飞跃式的发展&#xff0c;使其在越来越多的应用场景中更加友好和适用。然而&#xff0c;随着LLMs的智能和复杂度的增加&#xff0c;其参数数量&#xff0c;即权重和激活值的数量也在增加&#xff0c;这意…...

shell printf详解

默认的 printf 不会像 echo 自动添加换行符&#xff0c;我们可以手动添加 \n。 1. printf命令语法组成&#xff1a; printg format-string [arguments] 第一部分为格式化字符串&#xff0c;该字符串最好用引号括起来 第二部分为参数列表,例如字符串或变量值的列表,该列表需…...

【数据分析】用Python做事件抽取任务-快速上手方案

目录 方法一&#xff1a;使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二&#xff1a;使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;事件抽取是一项关键任…...

B端系统门门清之:HRM,人力资源系统,公司发展的源动力。

人才是公司发展的源动力&#xff0c;针对公司复杂人力的管理就是HRM系统的核心功能&#xff0c;本文就带领大家详细认识一下HRM系统&#xff0c;分别从什么是HRM系统&#xff0c;作用、功能模块、颜值提升四个方面来阐述。欢迎大家点赞评论收藏转发。 一、什么是HRM系统 HRM系…...

tplink安防监控raw文件转码合成mp4的方法

Tplink(深圳普联)专业的网络设备生产商&#xff0c;属于安防监控市场的后来者。Tplink的安防产品恢复了很多&#xff0c;其嵌入式文件系统也一直迭代更新。今天要说的案例比较特殊&#xff0c;其不仅仅要求恢复&#xff0c;还要求能解析出音频并且要求画面和声音实现“同步”。…...

每天一个数据分析题(三百八十三)- 聚类

关于忽略自相关可以带来什么问题描述错误的是&#xff1f; A. 均方误差可能严重低估误差项的方差 B. 可能导致高估检验统计量t值&#xff0c;致使本不显著的变量变得显著了 C. 参数估计值的最小方差无偏性不再成立 D. 参数估计值的最小方差无偏性仍成立 数据分析认证考试介…...

构建下一代数据解决方案:SingleStore、MinIO 和现代 Datalake 堆栈

SingleStore 是专为数据密集型工作负载而设计的云原生数据库。它是一个分布式关系 SQL 数据库管理系统&#xff0c;支持 ANSI SQL&#xff0c;并因其在数据引入、事务处理和查询处理方面的速度而受到认可。SingleStore 可以存储关系、JSON、图形和时间序列数据&#xff0c;以满…...

【经验分享】Ubuntu24.04安装微信

【经验分享】Ubuntu24.04安装微信(linux官方2024universal版) 文章如下&#xff0c;22.04和24.04微信兼容 【经验分享】Ubuntu22.04安装微信(linux官方2024universal版) 实测Ubuntu24.04LTS版本可以兼容。...

AXI学习笔记

文章目录 AXI口诀&#xff1a;AXI三种总线&#xff0c;三种接口&#xff0c;一个协议背景知识一、 AMBA&#xff1a;二、AXI2.1 通信协议与握手机制2.2 AXI协议特点2.3 三种AXI总线类型&#xff08;AXI4、AXI4-lite、AXI4-stream&#xff09;2.3.1 AXI通道&#xff08;5通道&am…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...