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

题目描述

在这里插入图片描述

使用递归方法解题

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

/*** 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}
}

示例用法

// 构建一个示例二叉树
//      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.xdnf.cn/news/1450872.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution:def maxPoints(self, points: List[List[int]]) -> int:n len(points)if n < 2:return nres 2for i in range(n):x1, y1 points[i][0], points[i][1]has {}for j in range(i 1, n):x2, y2 points[j][0], points…

x64汇编fastcall调用约定

x64汇编环境&#xff1a;只需要在x86基础上对项目属性进行设置&#xff0c;将平台设置为所有平台&#xff1b; 以及在将debug改为x64模式即可&#xff1a; 后续写完代码直接生成项目再使用本地调试器进行运行即可。 fastcall调用约定 在x64架构下&#xff0c;fastcall调用约定…

【StableDiffusion】采样方法对比优缺点及评估,采样器 调度器(目前已有的 采样器介绍与评估)

采样器 Sampler 采样方法 决定了 如何从 噪声 生成 图像 的过程&#xff0c;也就是去噪过程如何进行 包含 DPM 的采样方法&#xff08;逆转扩散采样&#xff09; DPM → Diffusion Probabilistic Models&#xff08;扩散概率模型&#xff09; DPM、DPM2 包含 DPM 的采样方…

解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾&#xff0c;玩到最后发现 yum 命令用不了&#xff0c;总是报下面的错误信息&#xff1a; There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/usr/l…

C# WPF入门学习主线篇(二十八)—— 使用集合(ObservableCollection)

C# WPF入门学习主线篇&#xff08;二十八&#xff09;—— 使用集合&#xff08;ObservableCollection&#xff09; 在WPF中&#xff0c;数据绑定是构建动态和响应式用户界面的关键。ObservableCollection是一个特别有用的集合类型&#xff0c;它不仅支持数据绑定&#xff0c;还…

Python | Leetcode Python题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution:def evalRPN(self, tokens: List[str]) -> int:op_to_binary_fn {"": add,"-": sub,"*": mul,"/": lambda x, y: int(x / y), # 需要注意 python 中负数除法的表现与题目不一…

面试题记录1

题目&#xff1a; 给定一个输入序列01101001101101101找出序列为1101并统计其个数。请用有限状态机&#xff08;FSM&#xff09;实现。 解题&#xff1a; 代码&#xff1a; module sequence_detector(input wire clk, // 时钟信号input wire reset, // 复位信号input wir…

JasperReport-报表中文不显示问题解决

在用Jaspersoft Studio进行报表设计的时候默认采用的字体是SansSerif&#xff0c;通过jasperreport的JAVA SDK进行报表输出时就会出现中文不显示问题。另外即便在Jaspersoft Studio设置的是中文字体&#xff0c;通过JAVA端生成也可能出现中文不显示。原因是SDK包中没有包含中文…

Github 2024-06-13开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Shell项目1TypeScript项目1Swift项目1PHP项目1Blade项目1JavaScript项目1从零开始构建你喜爱的技术 创建周期:2156…

【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统

系统功能: 此设计采用STM32单片机采集环境温湿度,烟雾浓度和一氧化碳浓度显示在OLED上&#xff0c;并将这些信息上报至阿里云平台。 1. 上电连接手机热点后自动连接阿里云&#xff0c;可通过阿里云平台收到系统上报的温湿度&#xff0c;烟雾 浓度&#xff0c;一氧化碳数据以…

日常销售数据分析为什么重要?三个维度全面分析日常销售数据

在当今电子商务的浪潮席卷全球的时代&#xff0c;网店如雨后春笋般涌现&#xff0c;并且竞争日趋激烈。在这样一个充满挑战与机遇的环境中&#xff0c;如何洞察市场动向&#xff0c;把握消费者需求&#xff0c;实现销售业绩的稳步增长&#xff0c;成为每一位电商运营者必须面对…

Jenkins For Windows编译构建C#项目环境搭建(完整版)

安装Jenkins 下载Windows安装包 官方下载地址 选择稳定版&#xff0c;这里下载的是最新版&#xff0c;如需下载指定版本点击 以前的发行版 配置java环境 下载 java jdk 17 jdk17官方下载链接 这里下载的是msi版本的安装包 安装jdk17 双击运行安装包&#xff0c;一直下…

Java | Leetcode Java题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution {public int evalRPN(String[] tokens) {int n tokens.length;int[] stack new int[(n 1) / 2];int index -1;for (int i 0; i < n; i) {String token tokens[i];switch (token) {case "":index--;stack…

【分布式技术专题】「OceanBase深度解析」 探索OceanBase产品矩阵与核心设计

探索OceanBase产品矩阵与核心设计 OceanBase的六大特性高扩展高可用多租户&#xff08;资源隔离&#xff09;OceanBase架构和功能OceanBase广泛的数据源支持 OceanBase的六大特性 OceanBase以其卓越的产品平台整合方案&#xff0c;充分展现了六大核心特性的卓越与全面。这一方…

PID算法的离散化和参数调节方式的介绍

目录 概述 1 背景介绍 2 数字式 PID 控制算法 2.1 位置式 PID 2.2 增量式 PID 2.3 两种算法比较 3 控制器参数整定 3.1 凑试法 3.2 临界比例法 3.3 经验法 4 参数调整规则的探索 概述 本文主要介绍离散化PID算法的实现原理&#xff0c;以方便对其进行数字化的处理&a…

人工智能将成为数学家的“副驾驶”

人工智能将成为数学家的“副驾驶” 数学传统上是一门独立的科学。1986年&#xff0c;安德鲁怀尔斯为了证明费马定理&#xff0c;退到书房里呆了7年。由此产生的证明往往很难让同事们理解&#xff0c;有些至今仍有争议。但近年来&#xff0c;越来越多的数学领域被严格地分解为各…

Python-json模块

一、相关概念 # 序列号 和反序列号 # 序列号&#xff1a;把内存中的数据类型转成一种特定格式&#xff0c;这种格式&#xff08;json/pickle&#xff09;可以用于存储&#xff0c;或者传输给其他平台 import json # 内存中是数据类型 ----> 序列化 ----> 特定格式&…

RK3568技术笔记六 新建 Ubuntu Linux 虚拟机

VMware 安装完成后&#xff0c;启动 VMware 软件。启动后在 VMware 主界面点击“创建新的虚拟机”。如下图所示&#xff1a; 开始对新建的虚拟机进行设置。选择“自定义”&#xff0c;然后点击“下一步”。如下图所示&#xff1a; 使用默认配置&#xff0c;单击“下一步”。如下…

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2&#xff0c;也就是一张图片被分割成四份 height, wi…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪&#xff0c;眼下&#xff0c;台山四九镇的早稻长势喜人&#xff0c;沉甸甸的稻穗迎风而动&#xff0c;已进入破口抽穗的关键期&#xff0c;即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里&#xff0c;合作社负责人梁明喜正仔细观察着稻苗的…