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

相关推荐
Evand J2 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
xu_yule2 小时前
算法基础(背包问题)—分组背包和混合背包
c++·算法·动态规划·分组背包·混合背包
摸鱼仙人~2 小时前
Flask-SocketIO 连接超时问题排查与解决(WSL / 虚拟机场景)
后端·python·flask
haiyu_y2 小时前
Day 45 预训练模型
人工智能·python·深度学习
1024肥宅2 小时前
现代 JavaScript 特性:ES6+ 新特性深度解析与实践
前端·javascript·面试
JH灰色2 小时前
【大模型】-Hugging Face生态
python·语言模型
【建模先锋】2 小时前
基于CNN-SENet+SHAP分析的回归预测模型!
人工智能·python·回归·cnn·回归预测·特征可视化·shap 可视化分析
蓝色汪洋2 小时前
数码串和oj
数据结构·算法
资深web全栈开发2 小时前
并查集(Union-Find)套路详解
leetcode·golang·并查集·unionfind