一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
前言
今天的题目为中等,比较典型的广度优先搜索的题目,通过广度优先搜索也能够比较简单的解出这道题,不了解什么是广度优先搜索或者深度优先搜索的可以先进行了解再来做题。
每日一题
今天的题目是 429. N 叉树的层序遍历,难度为中等
-
给定一个 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] 之间
题解
广度优先搜索。
题目要求我们层序遍历一颗树,并且返回每一层的值,这道题的重点在于,要理解N叉树的一个数据结构:
和之前的二叉树不同的是,因为是N叉树,所以每一个结点,可能会有 N 个子节点,所以题目给的数据结构中,val 代表当前结点的值,并且 children 因为是一个数组,保存了当前结点的 N 个子节点。
那么就是很经典的广度优先搜索题目,和深度优先搜索相反,广度优先搜索会优先想同一层级的其他子元素展开搜索,这就很符合这道题目的层序遍历的要求,我们可以通过广度优先搜索来获取当前层级的值,将它们和为一个数组,然后再把这个数组 push 进答案数组当中去。
对于当前结点,要去获取它的所有的结点,自然就是去遍历它的 children,并且对于每个同级别的结点,它们的子节点应该也都是同一个层级的。
然后我们可以用一个数来代表当前层级结点的所有子节点,在每次统计完子节点的数据之后就把这个数减一,然后在这个数为0的时候代表当前层级的子节点已经遍历完毕,进入下一层级。
/**
* // 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 []
}
const ans = []
const node = [root]
const level = []
let childCount = 1
while (node.length) {
const { val, children } = node.shift()
level.push(val)
if (children) {
for (const child of children) {
node.push(child)
}
}
childCount --
if (childCount === 0) {
childCount = node.length
ans.push(level.slice(0))
level = []
}
}
return ans
};