【力扣-94.二叉树的中序遍历】Python笔记

彻底搞懂二叉树遍历:从递归到迭代,前中后序一网打尽

摘要:还在为二叉树遍历的迭代写法头秃吗?本文带你彻底吃透前序、中序、后序遍历的迭代逻辑。通过"统一迭代法"的思路,配合清晰的代码注释和对比总结,助你轻松搞定 LeetCode 相关题目,从此面试不慌!


📚 核心知识点:为什么要学迭代法?

在刷二叉树题目时,递归(Recursion) 写法通常最简单,几行代码就能搞定。但在面试中,面试官往往会追问:"能不能用 迭代(Iteration) 实现?"为什么?因为递归本质上是利用系统的函数调用栈 ,如果树太深,容易导致栈溢出。而迭代法是手动维护一个栈(Stack) ,不仅更安全,还能体现你对遍历过程底层逻辑的深刻理解。

二叉树的三种遍历顺序:

  • 前序 (Pre-order) :中 → 左 → 右
  • 中序 (In-order) :左 → 中 → 右
  • 后序 (Post-order) :左 → 右 → 中

💻 代码实战:迭代法三部曲

我们将使用 Python 来实现。这里的核心思想是:用栈来模拟系统递归的过程。

1. 前序遍历 (Pre-order Traversal)

逻辑 :

前序遍历是"中左右"。因为栈是"后进先出"的,所以我们在压栈时,要先压右孩子,再压左孩子,这样弹出的时候就是"中 → 左 → 右"了。

python 复制代码
class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        
        res = []
        stack = [root]  # 1. 根节点先入栈
        
        while stack:
            # 2. 弹出栈顶元素(中间节点)
            node = stack.pop()
            res.append(node.val)  # 访问中间节点
            
            # 3. 注意顺序:先右后左(因为栈是后进先出)
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
                
        return res
2. 中序遍历 (In-order Traversal)

逻辑 :

中序遍历是"左中右"。这比较特殊,因为我们要先一路向左走到底,把路上的节点都压进栈,但不访问。等走不动了,再从栈里弹出一个节点访问,然后转向它的右孩子。

python 复制代码
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        stack = []
        cur = root  # 指针指向当前节点
        
        # 只要当前节点不为空,或者栈里还有节点,就继续循环
        while cur or stack:
            if cur:
                # 1. 一路向左,把遇到的节点全部入栈
                stack.append(cur)
                cur = cur.left
            else:
                # 2. 走到最左边了,开始处理栈顶节点(中间节点)
                cur = stack.pop()
                res.append(cur.val)  # 访问中间节点
                
                # 3. 转向右孩子,继续上述过程
                cur = cur.right
                
        return res
3. 后序遍历 (Post-order Traversal)

逻辑 :

后序是"左右中"。直接写"左右中"比较难,我们可以利用前序遍历的思路,改成"中右左",最后把结果数组反转一下,就变成了"左右中"。

python 复制代码
class Solution:
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        
        res = []
        stack = [root]
        
        while stack:
            node = stack.pop()
            res.append(node.val)  # 访问中间节点
            
            # 注意顺序:先左后右(这样弹出是 中→右→左)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        
        # 最后反转结果,变成 左→右→中
        return res[::-1] 

📊 统一对比总结(建议收藏)

为了方便记忆,我们可以把迭代法分为两类:简单调整法 (前序/后序)和 指针法(中序)。

遍历类型 核心逻辑 关键点
前序 中 → 左 → 右 栈:先入右,后入左。
中序 左 → 中 → 右 指针 cur 一路向左入栈,到底了再弹出访问,并转向右。
后序 左 → 右 → 中 修改前序逻辑:中 → 右 → 左,最后将结果 res 反转。

📌 作者寄语

二叉树遍历是数据结构的基石。前序和后序的迭代写法非常相似,只是入栈顺序和结果处理不同;而中序遍历因为访问顺序(左中右)和处理顺序(中左右)不一致,所以需要指针辅助。掌握了这三种写法,以后遇到二叉树的题目,不管是层序遍历还是路径总和,你都能游刃有余地写出非递归解法啦!

相关推荐
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河6 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年7 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
CS创新实验室7 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy7 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc7 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
把我格子衫拿来8 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
cpolar技术支持8 小时前
把配置发出去怕带出密钥?先把含凭据配置转成脱敏只读快照,用 cpolar 给同事核对差异
运维·python·内网穿透·cpolar·配置脱敏
优选资源分享8 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron