力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路

问题概述

给定一个二叉树的根节点 root,返回它的中序遍历。

什么是中序遍历?

中序遍历是三种主要的树遍历方法之一。它按照以下顺序访问节点:左子树 → 根节点 → 右子树

步骤:

  1. 遍历左子树(递归)
  2. 访问根节点
  3. 遍历右子树(递归)

可视化示例:

复制代码
树:        1
            \
             2
            /
           3

中序遍历: [1, 3, 2]
- 从 1 开始,向左(无)→ 处理 1
- 向右到 2,向左到 3 → 处理 3
- 回到 2 → 处理 2

关键特性:

对于二叉搜索树(BST),中序遍历产生有序的值(升序),因为所有左子节点 < 根节点 < 所有右子节点。

解法 1:递归

工作原理

使用递归自然地遵循中序遍历模式:

python 复制代码
class Solution:
    def inorderTraversal(self, root):
        if not root:
            return []
        
        return (self.inorderTraversal(root.left) + 
                [root.val] + 
                self.inorderTraversal(root.right))

复杂度分析

  • 时间复杂度: O(n) - 每个节点恰好访问一次
  • 空间复杂度: O(h) - 递归栈深度等于树的高度(最坏情况 O(n) 对于倾斜树)

何时使用

  • 直观 - 实现树遍历最自然的方式
  • 易于理解和实现
  • 适合学习递归

解法 2:迭代(使用栈)(推荐)

工作原理

使用显式栈来模拟递归调用栈:

python 复制代码
class Solution:
    def inorderTraversal(self, root):
        result = []
        stack = []
        current = root
        
        while current or stack:
            # 到达最左侧节点
            while current:
                stack.append(current)
                current = current.left
            
            # 处理节点
            current = stack.pop()
            result.append(current.val)
            
            # 移动到右子树
            current = current.right
        
        return result

复杂度分析

  • 时间复杂度: O(n) - 每个节点恰好访问一次
  • 空间复杂度: O(h) - 栈大小等于树的高度(最坏情况 O(n) 对于倾斜树)

何时使用

  • 推荐 - 对遍历有更多控制
  • 避免深度树的递归栈溢出
  • 可以轻松修改为其他遍历顺序

对比

方法 时间 空间 最佳适用
递归 O(n) O(h) 学习,直观实现
迭代 O(n) O(h) 生产代码,深度树

总结

递归和迭代方法都实现了 O(n) 时间复杂度。使用栈的迭代方法在生产代码中通常更受欢迎,因为它避免了潜在的栈溢出问题,并提供了对遍历过程的更多控制。关键洞察是尽可能向左走,处理节点,然后移动到右子树。

相关推荐
血小板要健康11 分钟前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备43 分钟前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.1 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
人机(未转人工)1 小时前
python 批量测试ip是否能ping( 多线程 )
python
cndes1 小时前
安装Miniconda+Jupyter notebook
ide·python·jupyter
怕浪猫1 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
Patrick在香港1 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
for_ever_love__1 小时前
python基础语法学习: 正则表达式
python·学习·正则表达式
aiqianji1 小时前
功能全面的教AI短篇小说写作的软件都有哪些?
人工智能·python
hetao17338372 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法