力扣【二叉树专题】👊 429. N 叉树的层序遍历

128 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 8 天,点击查看活动详情

题目链接

429. N 叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

测试用例

示例 1:

image.png

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

限制

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 104][0, 10^4] 之间

题目分析

由题知,需要我们对一颗 N叉树 按层遍历。

结合示例的输出数据,需要我们返回一个二维数组格式的数据,用 arr[n][m] 来表示这个数据结构的话,n 表示数的层数,m 表示每一层中元素的个数

一般情况下,对树按层遍历,就需要用到广度搜索优先的思路

初始化一个队列 let queue = [root] 表示当前可以遍历的元素,初始化一个长度标记 let len = queue.length 表示这个队列里,前面 len 个元素是同一层的;使用 arr 来记录下遍历的节点的值

基于上述的约束,我们每次都是取出 queue 中的第一个元素,将 queue 的所有子节点,依次存入到 queue 里,同时,对长度标记 len-1 处理;当 len=0 时,意味着当前层的节点遍历完了,我们需要将 len 重置为 queue.length,此时,我们还需要为 arr 插入一个新的空数组来接收下一层的节点的值

代码实现

var levelOrder = function(root) {
    if (root == null) return [];
    let queue = [root],
        len = queue.length;
    let arr = [];
    for (; queue.length > 0;) {
        arr.unshift([]);
        for (; len > 0; len--) {
            let temp = queue.shift();
            arr[0].push(temp.val);
            temp.children.forEach(n => queue.push(n))
        }
        len = queue.length;
    }
    return arr;
};

image.png