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

相关推荐
mit6.82425 分钟前
几何|阻碍链
算法
彼岸花开了吗26 分钟前
构建AI智能体:八十、SVD知识整理与降维:从数据混沌到语义秩序的智能转换
人工智能·python·llm
有一个好名字27 分钟前
力扣-小行星碰撞
算法·leetcode·职场和发展
MM_MS27 分钟前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
lamentropetion35 分钟前
E - Equal Tree Sums CF1656E
算法
代码游侠37 分钟前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
2301_8008951039 分钟前
hh的蓝桥杯每日一题--前缀和
职场和发展·蓝桥杯
山土成旧客40 分钟前
【Python学习打卡-Day40】从“能跑就行”到“工程标准”:PyTorch训练与测试的规范化写法
pytorch·python·学习
闲人编程1 小时前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
Xの哲學1 小时前
Linux Platform驱动深度剖析: 从设计思想到实战解析
linux·服务器·网络·算法·边缘计算