当前位置: 首页 > article >正文

LeetCode 热题 100 94. 二叉树的中序遍历

LeetCode 热题 100 | 94. 二叉树的中序遍历

大家好,今天我们来解决一道经典的算法题——二叉树的中序遍历。这道题在 LeetCode 上被标记为简单难度,要求我们给定一个二叉树的根节点 root,返回它的中序遍历结果。下面我将详细讲解解题思路,并附上 Python 代码实现。


题目描述

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

示例:

输入:root = [1,null,2,3]
输出:[1,3,2]

解题思路

中序遍历是二叉树遍历的一种方式,遍历顺序为:左子树 -> 根节点 -> 右子树。我们可以通过递归或迭代的方式来实现中序遍历。

核心思想
  1. 递归法

    • 递归地遍历左子树。
    • 访问根节点。
    • 递归地遍历右子树。
  2. 迭代法

    • 使用栈来模拟递归过程。
    • 从根节点开始,将所有左子节点入栈,直到没有左子节点。
    • 弹出栈顶节点,访问该节点,然后转向其右子节点。

代码实现

方法 1:递归法
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def inorderTraversal(root):
    """
    :type root: TreeNode
    :rtype: List[int]
    """
    result = []  # 用于存储遍历结果
    
    def inorder(node):
        if not node:
            return
        # 递归遍历左子树
        inorder(node.left)
        # 访问根节点
        result.append(node.val)
        # 递归遍历右子树
        inorder(node.right)
    
    inorder(root)  # 从根节点开始遍历
    return result
方法 2:迭代法
def inorderTraversal(root):
    """
    :type root: TreeNode
    :rtype: List[int]
    """
    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

代码解析

递归法
  1. 定义递归函数 inorder

    • 如果当前节点为空,则返回。
    • 递归遍历左子树。
    • 访问根节点,将其值加入结果列表。
    • 递归遍历右子树。
  2. 调用递归函数

    • 从根节点开始遍历。
迭代法
  1. 初始化

    • result 用于存储遍历结果。
    • stack 用于模拟递归的栈。
    • current 指向当前节点。
  2. 遍历过程

    • 将所有左子节点入栈,直到没有左子节点。
    • 弹出栈顶节点并访问,将其值加入结果列表。
    • 转向右子节点,继续遍历。

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每个节点被访问一次。
  • 空间复杂度
    • 递归法:O(n),递归调用栈的深度为树的高度。
    • 迭代法:O(n),栈的最大空间为树的高度。

示例运行

示例 1
# 创建二叉树 [1,null,2,3]
root = TreeNode(1)
root.right = TreeNode(2)
root.right.left = TreeNode(3)

# 中序遍历
print(inorderTraversal(root))  # 输出: [1, 3, 2]
示例 2
# 创建空二叉树 []
root = None

# 中序遍历
print(inorderTraversal(root))  # 输出: []
示例 3
# 创建二叉树 [1]
root = TreeNode(1)

# 中序遍历
print(inorderTraversal(root))  # 输出: [1]

总结

通过递归或迭代的方式,我们可以高效地实现二叉树的中序遍历。递归法代码简洁,但可能受递归深度限制;迭代法使用栈模拟递归过程,适合处理较大的树。希望这篇题解对你有帮助!如果还有其他问题,欢迎继续提问!

关注我,获取更多算法题解和编程技巧!


http://www.kler.cn/a/560900.html

相关文章:

  • 基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)
  • Redis中集合(Set)常见命令详解
  • MySQL 主从集群同步延迟问题分析与解决方案
  • Transformer LLaMA
  • Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案
  • 部署若依微服务遇到的坑
  • 被AWS反撸了,试一下能否申请退还
  • AWS EC2加速型计算实例全解析:从vt1到p5,如何为AI算力选择最佳引擎?
  • qt:多元素类,容器类,布局类
  • 基于Docker的前端环境管理:从开发环境到生产部署的实现方案
  • Rancher-产品架构
  • 2.3 变量
  • 基于大数据技术智能教学系统的设计与实现
  • 深入浅出ES6:现代JavaScript的基石
  • XML DOM4J 二、document对象
  • 离线环境如何玩转LLM?Ollama一键部署指南(Ubuntu)
  • Redis 集群的三种模式:一主一从、一主多从和多主多从
  • 【linux】全志t113平台修改ota升级配置文件,定向选择升级分区
  • AI赋能市场预测:ScriptEcho如何提升数据可视化效率
  • 自由学习记录(38)