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

news2024/11/25 12:23:35

说在前面

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

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

前序遍历

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

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

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

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

相关文章

Power BI 连接数据源/获取数据(Excel表、文件夹、数据库、网页等)

一、Power BI 支持的数据源类型 Power BI支持广泛的数据源类型&#xff0c;包括文件、数据库、云服务和其他来源。 文件&#xff1a;Excel、文本/CSV、XML、JSON、文件夹、PDF等。数据库&#xff1a;SQL Server, Oracle, IBM DB2, MySQL, PostgreSQL等。云服务&#xff1a;Azur…

怎么学习PMP才是最正确的?

每个人的学习方式各不相同&#xff0c;不能一概而论说某种学习方式就是错误的。学习方式并没有绝对的对错之分&#xff0c;只能说是否适合自己&#xff0c;是否能够达到预期的学习效果。并不是别人的学习方式就一定适合自己&#xff0c;也不是不适合自己的学习方式就一定是错误…

简单好用的远程软件推荐? 内网端口映射工具快解析

最近有一些小伙伴求推荐一款简单好用的远程软件&#xff0c;经过多方对比试用&#xff0c;还是推荐快解析。通过快解析内网端口映射&#xff0c;可以让主机电脑自带远程桌面连接直接提供跨网访问控制&#xff0c;外网访问端无需再安装客户端软件&#xff01; 1.目标服务器本地…

【QCustomPlot实战系列】QCPGraph堆叠图

将一个QCPGraph叠加到另一个QCPGraph上显示&#xff0c;就得到了折线堆叠图 static QCPScatterStyle GetScatterStyle(const QColor& color) {QPen pen(color, 2);return QCPScatterStyle(QCPScatterStyle::ssCircle,pen,Qt::white, 5); }static QCPGraph* AddGraph(QCus…

ADI Trinamic TMC2300 完美用于相机镜头的马达驱动芯片方案

TMC2300-LA是一款用于高达 1.2A RMS 的两相步进电机的低压驱动芯片&#xff0c;低电压的步进电机驱动器是用于电池供电的、空间和待机功率临界驱动器应用。它的静音驱动技术StealthChop™能够为便携式&#xff0c;家庭和办公应用程序的非窃听运动控制&#xff0c;确保安静&…

树莓派4B学习笔记11:PC端网线SSH连接树莓派_网线连接请求超时问题解决

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

优思学院|质量管理中如何应用5W1H或5W2H方法?

5W1H或者5W2H其实是一种"工作方式"&#xff0c;它不是"思考方法"&#xff0c;这种工作方式是通过回答“什么&#xff08;What&#xff09;&#xff1f;为什么&#xff08;Why&#xff09;&#xff1f;谁&#xff08;Who&#xff09;&#xff1f;何时&#…

Flutter【组件】富文本组件

简介 flutter 富文本组件。 github地址&#xff1a; https://github.com/ThinkerJack/jac_uikit 使用方式 运行 flutter pub add jac_uikit组件文档 使用方式&#xff1a; HighlightedTextWidget.builder(text: "全部文案包含高亮文案测试用",highlights: [Hig…

Rust高性能日志库tklog0.0.8—支持mod设置参数

tklog是rust高性能结构化日志库&#xff0c;支持同步日志&#xff0c;异步日志&#xff0c;支持自定义日志的输出格式&#xff0c;支持按时间&#xff0c;按文件大小分割日志文件&#xff0c;支持日志文件压缩备份&#xff0c;支持官方日志库标准API&#xff0c;支持mod独立参数…

控制台瞬间干净!Vue 删除生产环境烦人的console.log打印,看完这个你就会了!

1.安装插件 需要安装babel-plugin-transform-remove-console插件 yarn add babel-plugin-transform-remove-console //或者 npm install babel-plugin-transform-remove-console2.配置babel.config.js // 所有生产环境&#xff0c;或者也可以配置测试环境 const prodPlugin …

文心一言 VS 讯飞星火 VS chatgpt (285)-- 算法导论21.2 4题

四、请给出图 21-3 所示操作序列的一个运行时间的渐近紧确界&#xff0c;假定使用链表表示和加权合并启发式策略。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 图 21-3 没有直接给出&#xff0c;但通常这种操作序列可能与某种数据结构&#xff08;如并查集或…

计算机网络:网络层 - 虚拟专用网 VPN 网络地址转换 NAT

计算机网络&#xff1a;网络层 - 虚拟专用网 VPN & 网络地址转换 NAT 专用地址与全球地址虚拟专用网 VPN隧道技术 网络地址转换 NAT网络地址与端口号转换 NAPT 专用地址与全球地址 考虑到 IP 地址的紧缺&#xff0c;以及某些主机只需要和本机构内部的其他主机进行通信&…

【经验分享】Ubuntu 24.04 安装搜狗输入法(亲测有效)

【经验分享】Ubuntu 24.04 安装搜狗输入法&#xff08;亲测有效&#xff09; 先用如下Ubuntu22.04的安装方法进行安装 Ubuntu 22.04安装搜狗输入法 发现存在闪屏问题&#xff0c;那解决闪屏问题不就好了&#xff0c;解决方法如下&#xff1a; Ubuntu 23.10 搜狗拼音输入法闪屏…

OceanMind海睿思参与编写的《数据智能白皮书(2024年)》正式发布!

近日&#xff0c;由中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;牵头和组织&#xff0c;中新赛克海睿思作为TC601-WG16人工智能数据工作组合作伙伴参与编写的《数据智能白皮书&#xff08;2024年&#xff09;》正式发布。 中新赛克的卢云川、…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装&#xff0c;重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz&#xff1a; 打开终端&#xff08;Terminal&#xff09;。确保你…

MySQL——索引(概述和结构介绍)

一、索引概述 1、索引(index&#xff09;是帮助 MySQL 高效获取数据的数据结构(是一种有序的数据结构)。 2、在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构。这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些…

什么是联盟营销?独立站如何通过联盟营销提高转化率?

什么是联盟营销&#xff1f;独立站如何通过联盟营销提高转化率&#xff1f; 流量紧缺是跨境电商独立站永恒不变的难题&#xff0c;对于独立站卖家来说&#xff0c;广告投放、KOL引流等推广方式都能带来流量&#xff0c;但在广告流量越来越贵的今天&#xff0c;对于跨境电商独立…

构建一个强大的小型虚拟负载

您以前可能听说过“虚拟负载”一词&#xff0c;并想知道它的含义。 如果是这样&#xff0c;你并不孤单。虽然这个名字可能会让你了解它的作用&#xff0c;但它最初听起来可能令人困惑。 在这里&#xff0c;我们将深入探讨什么是虚拟负载&#xff0c;它们的作用以及如何选择适合…

王者荣耀图鉴皮肤怎么来的

王者荣耀图鉴皮肤怎么来的 最近一个王者荣耀图鉴开源很火 这个项目里面有很多的图片和音效资源&#xff0c;最简单的方法就是利用爬虫技术爬取这些图片资源。 第一步环境准备 Pyhton3.12macos系统 第二步查看王者荣耀官网 这些图片资源最简单的来源就是王者荣耀官网网站…

BFS:FloodFill算法

文章目录 FloodFill算法简介1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域总结 FloodFill算法简介 Flood Fill算法是一种用于确定与某个给定节点相连的区域的算法&#xff0c;常用于计算机图形学和图像处理。该算法可以用于诸如填充多边形、检测连通区域等任务。Flood …