题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/

1.问题理解

这个问题要求我们对二叉树进行层序遍历,也就是从上到下、从左到右逐层访问所有节点,最后将每一层的节点值以列表形式返回。

举个例子:

  • 对于二叉树 [3,9,20,null,null,15,7],第一层只有根节点 3,第二层有 920,第三层有 157,所以结果是 [[3],[9,20],[15,7]]

  • 如果树为空(root = []),则返回空列表 []

2.核心算法:队列+长度法

1.初始化队列:把根节点放入到队列(队列是先进先出的结构,适合按顺序访问节点)

2.循环处理当前层的长度:

  • 记录当前队列的长度(这个长度就是当前层的节点数量)

  • 遍历当前层的所有节点:

    • 从队列中取出一个节点,把它的值加入当前层的列表

    • 如果这个节点有左孩子,就把左孩子加入队列

    • 如果这个节点有右孩子,就把右孩子加入队列

  • 当前层遍历结束后,把当前层的列表加入结果集

3.返回结果集:当队列为空时,所有层都处理完毕

3.关键点和边界条件

  • 边界条件处理:如果根节点为空(root = None),直接返回空列表

  • 核心技巧

    • 用队列的长度来确定「当前层有多少个节点」,确保每次循环只处理完一整层的节点

    • 处理节点时,同时把它的左右孩子加入队列,为下一层的遍历做准备

from collections import deque
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        
        queue = collections.deque([root]) #首先加入根节点
        result = []
        while queue:
            level = []
            for _ in range(len(queue)):
                cur = queue.popleft() #队头弹出
                level.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            result.append(level)
        return result