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

[
[1],
[3,2,4],
[5,6]
]

说明:

树的深度不会超过 1000。
树的节点总数不会超过 5000。

解法一:带同层节点数量控制的BFS

普通的BFS并不检视队列长度,因此不知道当前队首元素是哪一层的。

在常规队列实现BFS的基础上引入层的控制。需要在当前层将所有节点的children取出,加入队列。下一层在处理时,队列的长度就是本层节点的数量。即对同层节点的处理应在一个for循环内完成,循环次数为当前队列中的元素数量,将属于本层的节点取空。

  1. class Solution:
  2. def levelOrder(self, root: 'Node') -> List[List[int]]:
  3. queue = [root] if root else []
  4. ans = []
  5. while queue:
  6. level = []
  7. for _ in range(len(queue)):
  8. node = queue.pop(0)
  9. level.append(node.val)
  10. queue.extend(node.children)
  11. ans.append(level)
  12. return ans

同类题型

102. 二叉树的层序遍历

  1. class Solution:
  2. def levelOrder(self, root: TreeNode) -> List[List[int]]:
  3. queue = collections.deque()
  4. if root:
  5. queue.append(root)
  6. ans = []
  7. while queue:
  8. level = []
  9. for _ in range(len(queue)):
  10. node = queue.popleft()
  11. level.append(node.val)
  12. if node.left:
  13. queue.append(node.left)
  14. if node.right:
  15. queue.append(node.right)
  16. ans.append(level)
  17. return ans

103. 二叉树的锯齿形层次遍历

  1. class Solution:
  2. def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
  3. queue = [root] if root else []
  4. l2r, ans = True, []
  5. while queue:
  6. level = []
  7. for _ in range(len(queue)):
  8. node = queue.pop(0)
  9. level.append(node.val)
  10. if node.left:
  11. queue.append(node.left)
  12. if node.right:
  13. queue.append(node.right)
  14. ans.append(level if l2r else level[::-1])
  15. l2r = not l2r
  16. return ans