1.题目
这道题是2024-2-17的签到题,题目难度为中等。
考察的知识点为BFS算法(树的层序遍历)。
题目链接:N叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
2.思路
对于这道题,我觉得要比二叉树的层序遍历要简单许多。为啥?因为二叉树的Node子结点属性是left和right,而N叉树的Node子结点属性是children,其中children是一个子结点列表。因此我们可以直接用循环来遍历它的子结点列表,不需要判断是否为空。
因此,这道题还是先定义一个结点队列q和一个结果列表rst。然后定义一个循环用来判断节点队列q是否为空。当满足条件的时候,我们再定义两个临时列表,分别是:
tmp:存储下一层的结点队列
r:保存这一层的结点值
然后我们直接用for循环遍历当前层的结点队列q,将每个结点的值添加到r里面,并进行二次循环,用于添加它的子结点到tmp队列中。
遍历结束后我们将当前层的结果r添加到rst列表中,方便最后我们返回结果;同时我们不要忘记刷新当前的结点队列为tmp(下一层的结点队列)。
3.代码
"""
# Definition for a Node.
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
# 如果root结点为空
if not root:
return []
# 定义结果列表
rst = []
# 定义当前层的结点队列
q = [root]
# 判断当前层节点队列是否为空
while len(q) > 0:
# 临时队列tmp:下一层的结点队列
# 当前层结果列表r,保存每个结点的值
tmp,r = [],[]
# 遍历当前层的结点
for node in q:
# 添加值到r里面
r.append(node.val)
# 遍历每个结点的子结点列表
for child in node.children:
# 添加到下一层结点队列tmp里面
tmp.append(child)
# 更新队列
q = tmp
# 添加当前层的结果列表到rst里面
rst.append(r)
return rst