94. 二叉树的中序遍历 (Swift版本, 递归)

embedded/2025/1/16 7:46:50/

题目描述

在这里插入图片描述

使用递归方法解题

使用了一个递归函数 inorder 来进行二叉树的中序遍历,并将结果存储在数组 ret 中

swift">/*** Definition for a binary tree node.* public class TreeNode {*     public var val: Int*     public var left: TreeNode?*     public var right: TreeNode?*     public init() { self.val = 0; self.left = nil; self.right = nil; }*     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }*     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {*         self.val = val*         self.left = left*         self.right = right*     }* }*/
class Solution {func inorderTraversal(_ root: TreeNode?) -> [Int] {var ret = [Int]()// 递归函数进行中序遍历func inorder(_ root: TreeNode?) {guard let root = root else {return}inorder(root.left)        // 递归处理左子树ret.append(root.val)      // 访问当前节点inorder(root.right)       // 递归处理右子树}// 从根节点开始中序遍历inorder(root)// 返回遍历结果return ret}
}

示例用法

swift">// 构建一个示例二叉树
//      1
//     / \
//    2   3
//   / \
//  4   5let root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left?.left = TreeNode(4)
root.left?.right = TreeNode(5)let solution = Solution()
let result = solution.inorderTraversal(root)
print(result)  // 输出: [4, 2, 5, 1, 3]

代码解析

  1. TreeNode 类

    • TreeNode 类定义了一个二叉树节点,包括节点的值 val、左子节点 left 和右子节点 right
  2. inorderTraversal 方法

    • 方法接受一个可选的 TreeNode 类型的参数 root,表示二叉树的根节点。
    • 定义一个数组 ret 来存储中序遍历的结果。
  3. 递归函数 inorder

    • inorder 函数接受一个可选的 TreeNode 作为参数,用于递归地进行中序遍历。
    • 使用 guard let 解包节点,如果节点为空则直接返回。
    • 递归调用 inorder 处理左子树。
    • 将当前节点的值添加到结果数组 ret 中。
    • 递归调用 inorder 处理右子树。
  4. 调用递归函数

    • 从根节点开始调用 inorder 函数,执行中序遍历。
    • 最后返回结果数组 ret

这个实现清晰且符合中序遍历的定义,对于二叉树的遍历操作非常适用。如果你有任何其他问题或需要进一步的解释,请告诉我。

复杂度分析

  • 时间复杂度:O(n),因为每个节点被访问一次。
  • 空间复杂度:O(n),由于结果数组需要 O(n) 的空间以及递归调用栈在最坏情况下也需要 O(n) 的空间。
时间分析

对于二叉树的中序遍历,算法需要访问每个节点恰好一次。

  • 每个节点访问一次:在遍历过程中,每个节点被递归地访问一次。因此,时间复杂度是 O(n),其中 n 是树中节点的数量。

总结:时间复杂度是 O(n)

空间分析

空间复杂度主要由递归调用的栈空间和存储结果的数组空间构成。

  1. 递归调用栈空间

    • 在最坏的情况下(即树的形态为单链表的情况下),递归调用栈的深度会达到树的高度。对于一个节点数为 n 的完全不平衡的树,高度为 n。
    • 对于平衡二叉树,树的高度为 log(n),因此递归调用栈的最大深度为 log(n)。
  2. 存储结果的数组

    • 存储结果的数组 ret 需要存储树中所有节点的值,所以需要 O(n) 的空间。

综合考虑两部分的空间复杂度:

  • 在最坏情况下(完全不平衡的树),空间复杂度是 O(n)(栈空间 + 结果数组空间)。
  • 在最佳情况下(完全平衡的树),空间复杂度是 O(n)(结果数组空间 + 栈空间为 O(log n))。

总结:空间复杂度是 O(n),因为结果数组的存储空间是 O(n),且递归调用栈的空间在最坏情况下也是 O(n)。


进阶

递归算法很简单,你可以通过迭代算法完成吗?


http://www.ppmy.cn/embedded/50789.html

相关文章

监控易监测对象及指标之:全面监控MongoDB 4数据库

随着大数据时代的来临,MongoDB作为一款高性能的NoSQL数据库,因其灵活的文档模型、水平扩展能力以及丰富的查询语言,已成为众多企业和开发者处理海量数据的首选工具。 断言是MongoDB内部错误检测的重要机制。监控易工具对MongoDB的断言情况进行…

设计师必看!PS Beta平替——宝藏国产PS-AI插件来啦!一键文生图、图生图等功能,纵享AI绘画魅力!

大家好,我是向阳 今天,我给大家分享一款宝藏PS插件—StartAI,可以说是PS Beta平替插件了! 内置功能齐全,拥有文生图、生成相似图、局部重绘、线稿上色、无损放大、扩图、艺术融合、高清修复、智能擦除等九大功能&…

02-QWebEngineView的使用

Qt WebEngine_hitzsf的博客-CSDN博客 一、QWebEngineView QWebEngineView 类是一个实现Web浏览器的便捷类,提供了back() 、forward()、reload()、stop() 等方法,可轻松实现页面的前进、后退、重载等导航功能,要实现一个简单的只有网页加载网…

【JDBC】Oracle数据库连接问题记录

Failed to load driver class oracle.jdbc.driver.OracleDriver in either of HikariConfig class oracle驱动包未正确加载,可以先尝试使用下面方式加载检查类是否存在,如果不存在需要手动下载odbc包 try {Class.forName("oracle.jdbc.driver.Ora…

拉依达的嵌入式学习和秋招经验

拉依达的嵌入式学习和秋招经验 你好,我是拉依达。目前我已经结束了自己的学生生涯,开启了人生的下一个阶段。 从研二准备秋招开始,我就逐渐将自己的学习笔记陆续整理并到CSDN上发布。起初只是作为自己学习的备份记录,后续得到了越…

Mongodb在UPDATE操作中使用$push向数组中插入数据

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

Zookeeper 一、Zookeeper简介

1.分布式系统定义及面临的问题 分布式系统是同时跨越多给物理主机,独立运行的多个软件所组成的系统。类比一下,分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组…

鸿蒙开发通信与连接:【@ohos.nfc.tag (标准NFC-Tag)】

标准NFC-Tag 本模块主要用于操作及管理NFC Tag。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import tag from ohos.nfc.tag;tag.getNfcATag getNfcATag(tagInfo: TagInfo): Nf…