LeetCode 429. N 叉树的层序遍历

这篇具有很好参考价值的文章主要介绍了LeetCode 429. N 叉树的层序遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

429. N 叉树的层序遍历

描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例

示例1
LeetCode 429. N 叉树的层序遍历

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例2
LeetCode 429. N 叉树的层序遍历

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

链接

https://leetcode.cn/problems/n-ary-tree-level-order-traversal/

解题思路

思路一: 广度优先遍历

  • 首先把根节点 root 放入队列中,随后在广度优先搜索的每一轮中,我们首先记录下当前队列中包含的节点个数(记为 len),即表示上一层的节点个数。
  • 在这之后,我们从队列中依次取出节点,直到取出了上一层的全部 len 个节点为止。当取出节点 node 时,我们将 node 的值放入一个临时列表,再将 node 的所有子节点全部放入队列中。

当这一轮遍历完成后,临时列表中就存放了当前层所有节点的值。这样一来,当整个广度优先搜索完成后,我们就可以得到层序遍历的结果

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if (root == null) return [];
    let res = [], queue = [root];
    while(queue.length) {
        let len = queue.length, curLevel = [];
        while(len--) {
            let node = queue.shift();
            curLevel.push(node.val);
            // 这里不再是 ndoe.left node.right 而是循坏node.children
            for (let item of node.children) {
                item && queue.push(item)
            }
        }
        res.push(curLevel);
    }
    return res;
};

时间复杂度: O(n), 其中 n 是二叉树的节点数
空间复杂度: O(n)

思路二: 深度优先搜索

使用一个临时变量(如「哈希表」)存储每个深度 depth 对应的节点列表,当处理到节点 node 时,将其值添加到其所在的深度列表中。

同时在 DFS 过程中记录下最大深度 max,跑完 DFS 后,根据 max 来构建答案
实现代码如下:

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if (root == null) return [];
    let max = 0, obj = {}, res = []; 
    const dfs = function (node, depth) {
        max = Math.max(max, depth);
        let arr = obj[depth] || [];
        arr.push(node.val);
        obj[depth] = arr;
        for (let item of node.children) item && dfs(item, depth + 1);
    }
    dfs(root, 0); 
    for (let i = 0; i <= max; i++) res.push(obj[i]);
    return res;
}

时间复杂度: O(n), 其中 n 是二叉树的节点数
空间复杂度: O(n)

优化: 不使用临时变量存储每个深度 depth 对应的节点列表, 每次访问深度为 depth 的层级的时候,先检查 res 是否存在下标为 depth 的位置,若没有,说明是首次访问 depth 层(depth 层的最左侧元素),此时将该位置创建出来,再把当前节点值 node 添加到 res[depth] 中
实现代码如下:

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if (root == null) return [];
    let res = []; 
    const dfs = function (node, depth) {
        res[depth] = res[depth] || [];
        res[depth].push(node.val); 
        for (let item of node.children) item && dfs(item, depth + 1);
    }
    dfs(root, 0);  
    return res;
}

参考资料

https://leetcode.cn/problems/n-ary-tree-level-order-traversal/solution/by-ac_oier-yeye/文章来源地址https://www.toymoban.com/news/detail-449371.html

到了这里,关于LeetCode 429. N 叉树的层序遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • LeetCode.107. 二叉树的层序遍历 II

    LeetCode.107. 二叉树的层序遍历 II

    107. 二叉树的层序遍历 II 这个题目考查的是二叉树的层序遍历,对于二叉树的层序遍历,我们需要借助 队列 这种数据结构。再来回归本题 ,我们只需要将 二叉树的层序遍历的结果逆序,就可以得到这道题我们要求的答案了。接下来我们的难题就是 如何实现二叉树的层序遍

    2024年02月21日
    浏览(16)
  • 【LeetCode热题100】--102.二叉树的层序遍历

    【LeetCode热题100】--102.二叉树的层序遍历

    广度优先搜索: 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键

    2024年02月07日
    浏览(27)
  • 每日一题:LeetCode-102.二叉树的层序遍历

    每日一题:LeetCode-102.二叉树的层序遍历

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月05日
    浏览(16)
  • leetcode做题笔记107. 二叉树的层序遍历 II

    leetcode做题笔记107. 二叉树的层序遍历 II

    给你二叉树的根节点  root  ,返回其节点值  自底向上的层序遍历  。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 本题要求二叉树的层序遍历,并且是从下至上的层序遍历,可以考虑先按照从上至下的层序遍历先将层序遍历结果放到数组中,再对每层

    2024年02月11日
    浏览(13)
  • 【Py/Java/C++三种语言详解】LeetCode每日一题240216【二叉树BFS】LeetCode103、二叉树的层序遍历II

    【Py/Java/C++三种语言详解】LeetCode每日一题240216【二叉树BFS】LeetCode103、二叉树的层序遍历II

    有LeetCode交流群/华为OD考试扣扣交流群可加: 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336 了解算法冲刺训练 LeetCode103、二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进

    2024年02月20日
    浏览(12)
  • ★102. 二叉树的层序遍历

    ★102. 二叉树的层序遍历

    很巧妙的,又学习了一种层次遍历的方法, 就是说根据当前的队列的长度去遍历,遍历的当前队列的长度就是该层次的节点个数。

    2024年02月05日
    浏览(16)
  • 41 二叉树的层序遍历

    41 二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 提示: 树中节点数目在范围 [0, 2000] 内 -1000 = Node.val = 1000

    2024年02月07日
    浏览(14)
  • 代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    本文思路和详细讲解来自于:代码随想录 (programmercarl.com) 题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode) 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建队列,向里加入root元素,计算队列的长度,也就是每一层的元素个数,while循环,si

    2024年02月06日
    浏览(12)
  • 算法进阶——求二叉树的层序遍历

    算法进阶——求二叉树的层序遍历

    题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)。 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ] 提示: 0 = 二叉树的结点数 = 1500 示例1 示例2 思路 利用辅助队列,通过bfs(广度优先)算法遍历二叉树

    2024年01月24日
    浏览(17)
  • day-20 二叉树的层序遍历

    day-20 二叉树的层序遍历

    思路:利用队列进行广度优先遍历即可 注意点:ArrayList执行remove之后,索引i会立即重排,注意可能越界 code:

    2024年03月19日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包