12.23二叉树的层序遍历

python 复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def levelOrder(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[List[int]]
        """
        # 算法基础:队列
        # 初始化结果列表,存储各层节点值
        result = []
        # 特殊处理:空二叉树
        if not root:
            return result

        # 初始化队列,将根节点放入
        queue = deque()
        queue.append(root)

        # 循环处理
        while queue:
            # 记录当前层节点数:实现「分层存储」的核心步骤,没有这一步,就无法区分不同层的节点。
            level_size = len(queue)
            # 当前层临时列表
            current_level = []

            # 遍历当前层所有列表
            '''
            关于 _(下划线变量)
在 Python 中,_ 是一个「占位符变量」,它表示:我们需要执行循环,但并不需要使用循环中的索引值(也就是不需要知道当前是第几次循环),只是单纯要循环指定次数。
            '''
            for _ in range(level_size):
                # 取出队首节点
                node = queue.popleft()
                # 将当前节点的值存入临时层
                current_level.append(node.val)
                # 遍历当前节点的子节点
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            result.append(current_level)
        return result

二叉树层序遍历(LeetCode 102)核心总结

一、题目核心要求

  1. 遍历规则:按「从上到下、同一层从左到右」的顺序访问二叉树节点(广度优先搜索 BFS 应用)
  2. 输入输出 :
    • 输入:二叉树根节点 root(可能为空 None)
    • 输出:二维列表 List[List[int]],每个子列表对应二叉树的一层节点值(如 [[3], [9,20], [15,7]])

二、核心实现原理

  1. 核心依赖 :队列(Python 中用 collections.deque 实现),利用队列「先进先出(FIFO)」的特性,缓存下一层待处理节点,保证遍历顺序。
  2. 核心思想:逐层处理节点,先处理当前层所有节点,再缓存下一层节点,循环往复直到所有节点处理完毕。
  3. 效率保障 :deque.popleft() 时间复杂度为 O (1),比普通列表 pop(0)(O (n))更高效,是实现队列的首选。

三、关键步骤(对应代码逻辑)

  1. 初始化 :
    • 定义结果列表 result = [],用于存储分层节点值;
    • 特殊处理:若 root 为 None(空树),直接返回空列表 result;
    • 初始化队列 queue = deque(),并将根节点 root 入队。
  2. 核心循环(处理所有层) :
    • 循环条件:while queue(队列不为空,说明还有待处理节点);
    • 按层分组关键:level_size = len(queue)(记录当前层节点数,确保只处理当前层);
    • 初始化当前层临时列表 current_level = [],用于存储当前层节点值;
    • 遍历当前层:for _ in range(level_size)(循环 level_size 次,精准处理当前层所有节点):
      1. 取出节点:node = queue.popleft()(从队列头部取出节点,遵循 FIFO 特性);
      2. 记录值:current_level.append(node.val)(将当前节点值存入临时列表);
      3. 缓存下一层:若节点有左 / 右子节点,依次将左、右子节点入队(保证下一层遍历顺序从左到右);
    • 存入当前层结果:result.append(current_level)(将当前层节点值列表加入总结果)。
  3. 返回结果 :循环结束后,返回 result(已按层分组的二维列表)。

四、核心代码细节解析(针对你的疑问点)

代码片段 核心意义
for _ in range(level_size) 1. _ 是占位符,标识无需使用循环索引,仅需执行 level_size 次循环;2. 精准处理当前层所有节点,实现按层分组,避免混淆当前层和下一层。
node = queue.popleft() 1. 从队列头部取出节点,遵循 FIFO 特性,保证遍历顺序;2. 取出后节点从队列中移除,避免重复处理;3. 赋值给 node 用于后续存值和取子节点操作。
level_size = len(queue) 按层分组的核心,进入 while 循环时,队列中恰好是当前层所有节点,其长度即为当前层节点数。
queue.append(node.left/right) 缓存下一层节点,先左后右入队,保证下一层遍历顺序仍为从左到右。

五、易错点提醒

  1. 遗漏空树处理:未判断 root is None,可能导致后续队列操作报错;
  2. 未使用 level_size:直接在 while 中处理节点,无法实现按层分组,返回一维列表而非二维列表;
  3. 使用普通列表代替 deque:list.pop(0) 效率低下,数据量大时会超时;
  4. 子节点入队顺序错误:先右后左入队会导致同层遍历顺序颠倒,不符合题目要求。

六、简洁速记口诀

  1. 队列初始化,根节点入队;
  2. 空树先返回,循环处理队;
  3. 记录层大小,临时存层值;
  4. 取出节点值,子节点入队;
  5. 层值入结果,最终返回之。
相关推荐
在世修行2 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885723 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI3 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿4 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫4 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots6 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq6 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司6 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc
砚底藏山河7 小时前
python量化实操:冷热分层存储
java·开发语言·python·金融