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

学习记录:js算法(四十九):二叉树的层序遍历

文章目录

    • 二叉树的层序遍历
      • 网上思路
        • 队列
        • 循环
    • 总结

二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)。

图一:
在这里插入图片描述

示例 1:如图一
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:
输入:root = [1]
输出:[[1]]

示例 3:
输入:root = []
输出:[]
 

我的思路
想使用数组的,但是没成功
网上思路
循环
队列

网上思路

队列
var levelOrder = function (root) {
    // 如果根节点为空,返回空数组
    if (!root) {
        return [];
    }
    const result = []; // 用于存储结果
    const queue = [root]; // 初始化队列,开始时将根节点入队
    while (queue.length > 0) {
        const levelSize = queue.length; // 当前层的节点数量
        const currentLevel = []; // 存储当前层的节点值
        for (let i = 0; i < levelSize; i++) {
            const node = queue.shift(); // 从队列中取出节点
            currentLevel.push(node.val); // 将节点值加入当前层的数组
            // 如果左子节点存在,入队
            if (node.left) {
                queue.push(node.left);
            }
            // 如果右子节点存在,入队
            if (node.right) {
                queue.push(node.right);
            }
        }
        // 将当前层的节点值数组加入结果数组
        result.push(currentLevel);
    }
    return result; // 返回层序遍历的结果
};

讲解

  1. 队列初始化:使用一个队列来存储待访问的节点,初始时将根节点入队。
  2. 循环访问:当队列不为空时,循环进行以下操作:
    • 记录当前层的节点数量。
    • 创建一个数组 currentLevel 用于存储当前层的节点值。
    • 使用一个 for 循环遍历当前层的所有节点:
    • 从队列中取出节点并记录其值。
      如果该节点有左子节点或右子节点,则将它们入队。
  3. 结果存储:将当前层的节点值数组加入到结果数组 result 中。
  4. 返回结果:最终返回层序遍历的结果数组。
循环
var levelOrder = function (root) {
    // 如果根节点为空,返回空数组
    if (!root) {
        return [];
    }

    const result = []; // 用于存储结果
    const currentLevel = [root]; // 初始化当前层的节点数组

    while (currentLevel.length > 0) {
        const nextLevel = []; // 用于存储下一层的节点
        const currentValues = []; // 存储当前层的节点值

        // 遍历当前层的所有节点
        for (let i = 0; i < currentLevel.length; i++) {
            const node = currentLevel[i]; // 获取当前节点
            currentValues.push(node.val); // 记录节点值

            // 如果左子节点存在,加入下一层
            if (node.left) {
                nextLevel.push(node.left);
            }
            // 如果右子节点存在,加入下一层
            if (node.right) {
                nextLevel.push(node.right);
            }
        }

        // 将当前层的节点值加入结果数组
        result.push(currentValues);

        // 更新当前层为下一层
        currentLevel.length = 0; // 清空当前层
        currentLevel.push(...nextLevel); // 将下一层的节点加入当前层
    }

    return result; // 返回层序遍历的结果
}

讲解

  1. 当前层初始化:使用一个数组 currentLevel 来存储当前层的节点,初始时将根节点放入该数组。
  2. 循环访问:当 currentLevel 不为空时,循环进行以下操作:
    • 创建一个新的数组 nextLevel 用于存储下一层的节点。
    • 创建一个数组 currentValues 用于存储当前层的节点值。
  3. 遍历当前层:使用一个 for 循环遍历 currentLevel 中的节点:
    • 记录节点值到 currentValues
    • 如果节点有左子节点或右子节点,则将它们加入 nextLevel
  4. 结果存储:将 currentValues 加入到 result 中。
  5. 更新当前层:清空 currentLevel,并将 nextLevel 中的节点加入 currentLevel
  6. 返回结果:最终返回层序遍历的结果数组。

总结

任重而道远!


http://www.kler.cn/news/329415.html

相关文章:

  • 【AI大模型】深入Transformer架构:编码器部分的实现与解析(上)
  • JavaScript爬虫:数据抓取的艺术与实践
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十三章 Linux连接档概念
  • 数学建模运筹优化——规划问题Python版(线性、非线性、整数、0/1)
  • 中九无科研无竞赛保研经验帖——上交软院、中科大计算机、复旦工程硕、南大工程硕、浙大软件
  • 【MySQL】逐一更新数据(字段唯一)-存储过程
  • 《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计
  • 西电25考研 VS 24考研专业课大纲变动汇总
  • Oracle EBS中 预算编制与计划 模块的财务流程概览
  • golang web笔记-2.请求request
  • 大表性能优化的关键技术
  • 【Vue】从后端返回数据如何保留文本的格式,包括换行
  • 数据库查询
  • 注册安全分析报告:科研诚信查询平台无验证方式导致安全隐患
  • buuctf [ACTF2020 新生赛]Include
  • 面试题05.08绘制直线问题详解(考察点为位运算符)
  • 软件设计模式概述
  • 面试题:MySQL你用过WITH吗?领免费激活码
  • PHP安装后Apache无法运行的问题
  • [Redis][主从复制][上]详细讲解
  • CSS全解析
  • 滚雪球学MySQL[10.2讲]:数据库性能问题排查详解:从慢查询优化到内存与CPU使用分析
  • DES、3DES 算法及其应用与安全性分析
  • 【RabbitMQ 项目】客户端:连接模块
  • CSP 安全配置案例
  • 【设计模式-命令】
  • Elasticsearch学习笔记(1)
  • 二、词法分析,《编译原理》(本科教学版),第2版
  • 【MySQL基础刷题】总结题型(一)
  • 简单的微信小程序个人 个人详情页