JavaScript——二叉树层序遍历

JavaScript——二叉树层序遍历题目描述给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。示例二叉树:[3,9,20,null,null,15,7], 3/\920/\157返回其层序遍历结果:[[3],[9,20],[15,7]]递归实现代码varlevelOrder=function(root){if(root===null)return[]l

大家好,又见面了,我是你们的朋友全栈君。

题目描述

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

示例
二叉树:[3,9,20,null,null,15,7],

  	3
   / \
  9  20
    /  \
   15   7

返回其层序遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

递归实现

代码

  var levelOrder = function(root) { 
   
    if (root === null)
        return []
    let result = [];
    let deep = 0;
    recursion(root);

    function recursion(root) { 
   
        deep++;
        if (result[deep - 1])
            result[deep - 1].push(root)
        else
            result[deep - 1] = [root]
        if (root.left != null)
            recursion(root.left)
        if (root.right !== null)
            recursion(root.right)
        deep--
        return
    }
    return result;

};

let root = { 
   
    value: 3,
    left: { 
   
        value: 9,
        left: null,
        right: null
    },
    right: { 
   
        value: 20,
        left: { 
   
            value: 15,
            left: null,
            right: null
        },
        right: { 
   
            value: 7,
            left: null,
            right: null
        }
    }
}

console.log(levelOrder(root))

思路解析

不得不说递归虽然性能有些不太友好,但是是最容易被想到的方案。我们来一步一步解析一个流程,捋一下代码逻辑。

  • 第一步判断root是否是null,如果为空我们直接返回空数组即可,如果不为空继续我们的代码运行
  • 第二步声明了两个变量result用来承接最后的数组,并作为最后的结果返回。deep用来表示当前节点的层级,方便我们向result对应数组中添加元素。
  • 然后就到了我们的递归方法recursionrecursion的参数是当前节点。在recursion中现实节点深度加一,我们要注意这个深度的流程是,对于二叉树的结构,向下递归一层deep加一,向上return一层deep减一。
  • 判断result对应该层的数组元素是否存在,如果不存在直接等于[root],如果存在则选择push方式添加当前root
  • 添加完当前节点就需要判断,当前节点的左节点是否存在,如果存在将当前节点的左节点作为参数递归调用当前recursion函数,如果不存在则跳过
  • 当前节点的右节点是否存在,如果存在将当前节点的右节点作为参数递归调用当前recursion函数,如果不存在则跳过
  • 当左节点右节点都不存在则深度减一并向上返回,或者节点的左节点右节点都已经遍历完毕也是同样深度减一并向上返回。
  • 当全部执行完毕,返回result

因为我们使用deep变量标识了当前节点的深度,所以在添加元素时可以添加在对应的位置上。算是得到了要求的数组,但是严格意义上来说,并不算是层级遍历。毕竟层级遍历必须要是使用队列来解决。

图示

请添加图片描述

队列实现

代码

var levelOrder = function(root) { 
   
    let result = []
    if (!root) return result
    let queue = [root]

    let res = []
    let items = []
    while (queue.length != 0 || items.length != 0) { 
   
        if (!queue.length) { 
   
            queue = items
            result.push(res)
            items = []
            res = []
        }
        let nowRoot = queue.shift()
        if (nowRoot) { 
   
            res.push(nowRoot.val);
            items.push(nowRoot.left)
            items.push(nowRoot.right)
        }
    }
    return result
};

思路解析

  • 同样result用来承接最后结果,queue承接当前层的全部节点,作为队列去使用,res去承接当前层queue中取出的节点的val值,items用来承接下一层的全部节点
  • 判断root是都为空,和上面一样就不详细解析
  • 进入循环,只有当当前层的节点遍历完毕并且没有下一层节点的情况下才会跳出循环
  • 当前层节点没有全部取出(queue的长度不为0),则取出queue中的第一个节点,节点不为null的话将当前节点的valpushres,并获取其左右节点pushitems
  • queue全部取出,说明当前层的节点已经全部遍历完毕,每个节点的valres数组中,每个节点的左右节点在items中。我们将items赋值给queue来遍历下一层的全部节点,将res整个数组pushresult结果集中,并重置itemsres
  • 当前层遍历完毕并且当前层全部节点都没有子节点,说明全部节点遍历完毕,跳出循环
  • 返回结果集
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143626.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月21日 上午9:40
下一篇 2022年5月21日 上午9:40


相关推荐

  • 经验正交函数分析法(EOF)在matlab上的实现

    经验正交函数分析法(EOF)在matlab上的实现原理与计算步骤数据准备数据集为福建省 28 个气象站 1960 2013 年的年际降水量数据 行为站点编号 数值格式 列为年份时间 数值格式 部分数据如下 matlab 代码需要代码 包括 REOF 的请根据文章最后面的信息联系我 运行结果及分析空间分布特征分析前 5 个特征向量特征值的累积贡献率达到 85 4 但只有前两个特征根的误差范围不重叠通过

    2026年3月19日
    2
  • Spring Cloud Sleuth进阶实战

    Spring Cloud Sleuth进阶实战为什么需要 SpringCloudS 微服务架构是一个分布式架构 它按业务划分服务单元 一个分布式系统往往有很多个服务单元 由于服务单元数量众多 业务的复杂性 如果出现了错误和异常 很难去定位 主要体现在 一个请求可能需要调用很多个

    2026年3月18日
    2
  • 别再浪费算力!豆包AI正确调用DeepSeek模型的配置要点

    别再浪费算力!豆包AI正确调用DeepSeek模型的配置要点

    2026年3月12日
    2
  • 解决pycharm需手动配置环境变量问题

    解决pycharm需手动配置环境变量问题问题 在运行程序前 需要配置一下环境变量 但是通过 terminal 发送命令并不好使 exportLD LIBRARY PATH LD LIBRARY PATH usr local cuda extras CUPTI lib64 在这个地方找一下 在 EditConfigur 中 找到这个 EnvironmentV 添加 name 和 value apply 一下就 ok 了 也不需要每次都手动输入 这里的 name 和 value 根据需要进行设置 比如提示缺少 key PROP 那么就填

    2026年3月26日
    2
  • HTML网页设计结课作业 榆林子州 HTML5响应式旅游景区网站模板

    HTML网页设计结课作业 榆林子州 HTML5响应式旅游景区网站模板网站布局方面 计划采用目前主流的 能兼容各大主流浏览器 显示效果稳定的浮动网页布局结构 网站程序方面 计划采用最新的网页编程语言 HTML5 CSS3 JS 程序语言完成网站的功能设计 并确保网站代码兼容目前市面上所有的主流浏览器 已达到打开后就能即时看到网站的效果 网站素材方面 计划收集各大平台好看的图片素材 并精挑细选适合网页风格的图片 然后使用 PS 做出适合网页尺寸的图片 网站文件方面 网站系统文件种类包含 html 网页结构文件 css 网页样式文件 js 网页特效文件 images 网页图片文件

    2026年3月19日
    2
  • Jquery确认对话框弹出

    Jquery确认对话框弹出Jquery确认对话框弹出

    2022年4月23日
    94

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号