题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/
1.问题理解
这个问题要求我们对二叉树进行层序遍历,也就是从上到下、从左到右逐层访问所有节点,最后将每一层的节点值以列表形式返回。
举个例子:
对于二叉树
[3,9,20,null,null,15,7],第一层只有根节点3,第二层有9和20,第三层有15和7,所以结果是[[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