如何在Python中实现树的层次遍历_利用队列结构实现按层访问节点

P粉602998670

P粉602998670

2026-05-30

151人浏览

原创

用deque而非list模拟队列因list.pop(0)为o(n),导致层次遍历退化至o(n²),而deque.popleft()为o(1);需用len(q)固定层大小、跳过none节点、判空用if q:,并严格检查node非空再访问子节点。

如何在python中实现树的层次遍历_利用队列结构实现按层访问节点

为什么用 collections.deque 而不是列表模拟队列

用普通 listpop(0) 做出队操作是 O(n) 时间复杂度,层次遍历中每访问一个节点都触发一次,整体退化到 O(n²)。而 dequepopleft() 是 O(1),适合高频进出场景。

常见错误现象:list.pop(0) 在大数据量下明显卡顿,甚至超时;用 queue.Queue 反而引入线程安全开销,纯单线程场景没必要。

  • 导入方式固定写 from collections import deque
  • 初始化: q = deque([root]),注意传入可迭代对象(哪怕只有一个元素也要加方括号)
  • 判空统一用 if q:,不要用 len(q) > 0

如何正确处理空节点和分层边界

层次遍历的核心难点不是“访问”,而是“知道当前在哪一层”。不显式记录层级信息,就无法区分 [3,9,20,null,null,15,7] 中的 9 和 20 是否同层。

推荐做法:每次循环开始前,先记下当前队列长度 level_size = len(q),然后只 pop 这么多次——这恰好对应当前层所有节点。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载
  • 不能在 for 循环里动态调 len(q),因为子节点正不断加入
  • 遇到 None 节点直接跳过,不 append 其左右子节点(否则会把空指针带入下一层)
  • 如果题目要求返回二维列表(每层一个子列表),就在每轮 level_size 循环内收集值

TreeNode 结构与输入兼容性要点

LeetCode 风格的 TreeNode 通常含 valleftright 三个属性,但实际项目中可能用字典或命名元组。遍历时必须确保访问 node.left 前判断 node 非空。

典型错误:未检查 node 就直接取 node.left,抛出 AttributeError: 'NoneType' object has no attribute 'left'

  • 入口处必须判 if not root: return []
  • 入队前检查: if node.left:q.append(node.left)
  • 不要依赖 isinstance(node, TreeNode) 做类型兜底——实际数据可能混入 dictNone

要不要用递归实现层次遍历

可以,但不推荐。递归本质靠栈,而层次遍历天然需要 FIFO,强行用递归需额外维护层级索引和结果容器,代码更绕、易错且无性能优势。

有人尝试用 DFS 记录 depth 参数再按层聚合,这属于“伪层次遍历”:它能产出正确结果,但访问顺序仍是深度优先,无法在遍历中途做层内剪枝(比如“找到某层第一个偶数就停止”)。

  • 真正需要“访问即处理”的场景(如实时渲染树形 UI),必须用队列迭代
  • 递归版本在 Python 中还有栈深度限制,树深超千层易报 RecursionError
  • 面试中写递归解法,大概率会被追问“怎么改成迭代”
真实项目里最容易被忽略的是空树和单节点树的边界处理——它们不报错,但可能让后续逻辑(比如计算宽度、找层平均值)除零或索引越界。别假设输入一定有多个节点。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1105

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8820

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1552

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

531

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习