N 叉树的层序遍历

289 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

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

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

示例 1:

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

示例 2:

输入: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]]

提示:

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

二、思路分析

这道题目考察的是树的层级遍历问题,层次遍历就是表面意思,一层层的遍历,同一层的遍历按照从左到右逐个遍历。 与我们之前说过的二叉树的层级遍历的本质其实是一样的,我们可以使用一个队列来进行解题。队列是一种先进先出(First in First Out)的数据结构,简称 FIFO。队列的先进先出规则可以让我们按顺序地遍历完这棵树的每一层的节点,也就是可以得到题目要求的结果,解题的具体步骤如下:

  • 1、将根节点入队 因为我们需要把不同层级的节点区分开来,所以这里我使用了一个floor标识来做标记;
let res = [],queue = [{floor:0,r:root}];
  • 2、队内元素出队,并将出队元素的子节点入队;
while(queue.length > 0){
        const q = queue.shift();
        res[q.floor] ? res[q.floor].push(q.r.val) : res.push([q.r.val]);
        if(q.r.children){
            const children = q.r.children;
            for(let i = 0; i < children.length; i++) queue.push({floor:q.floor + 1,r:children[i]});
        }
    }
  • 3、队空的时候即可输出答案 AC代码如下。

三、AC代码

/**
 * // Definition for a Node.
 * function Node(val,children) {
 *    this.val = val;
 *    this.children = children;
 * };
 */

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if(!root) return [];
    let res = [],queue = [{floor:0,r:root}];
    while(queue.length > 0){
        const q = queue.shift();
        res[q.floor] ? res[q.floor].push(q.r.val) : res.push([q.r.val]);
        if(q.r.children){
            const children = q.r.children;
            for(let i = 0; i < children.length; i++) queue.push({floor:q.floor + 1,r:children[i]});
        }
    }
    return res;
};