LeetCode题练习与总结:二叉树的中序遍历--94

一、题目描述

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

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

二、递归方法

(一)解题思路

  1. 如果当前节点为空,返回。
  2. 递归遍历左子树。
  3. 访问当前节点,将节点的值添加到结果列表中。
  4. 递归遍历右子树。

(二)具体代码

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();inorder(root, result);return result;}private void inorder(TreeNode node, List<Integer> result) {if (node == null) {return;}inorder(node.left, result);result.add(node.val);inorder(node.right, result);}
}

(三)时间复杂度和空间复杂度

1. 时间复杂度
  • 递归方法会访问树中的每个节点恰好一次,因此时间复杂度与树中节点的数量成正比。
  • 在这个算法中,每个节点都会被访问一次,所以时间复杂度是 O(n),其中 n 是二叉树中的节点数。
2. 空间复杂度
  • 递归方法的空间复杂度主要取决于递归栈的深度,这通常与树的高度成正比。
  • 在最坏的情况下,树完全不平衡,每个节点都只有左子节点或者只有右子节点,递归栈的深度会达到节点数 n,因此空间复杂度为 O(n)。
  • 在最好的情况下,树是完全平衡的,递归栈的深度是 log(n),因此空间复杂度为 O(log(n))。
  • 综合考虑,空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n)),平均情况下则介于两者之间。

综上所述,递归方法的中序遍历代码的时间复杂度是 O(n),空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n))。

(四)总结知识点

1. 递归(Recursion):

  • 代码中使用了递归函数 inorder 来遍历二叉树的左子树、根节点和右子树。
  • 递归是一种常用的算法设计技巧,它通过函数自身调用自己来进行循环。

2. 二叉树(Binary Tree):

  • 代码操作的数据结构是二叉树,每个节点包含一个值和指向左右子节点的引用。
  • 二叉树是一种基础的数据结构,常用于各种算法问题。

3. 二叉树的中序遍历(Inorder Traversal of a Binary Tree):

  • 中序遍历是一种遍历二叉树的方法,按照“左-根-右”的顺序访问每个节点。
  • 这是二叉树遍历的三种基本方法之一(其他两种是前序遍历和后序遍历)。

4. Java 集合框架(Java Collections Framework):

  • 代码使用了 ArrayList 来存储遍历的结果,这是 Java 集合框架中的一个类。
  • ArrayList 是一个可调整大小的数组实现,提供了对元素的快速随机访问。

5. 函数定义和调用(Function Definition and Invocation):

  • 代码定义了两个函数:inorderTraversal 和 inorder
  • inorderTraversal 是公共方法,供外部调用;inorder 是私有辅助方法,用于递归遍历。

6. 基本语法(Basic Syntax):

  • 代码使用了基本的 Java 语法,如类定义、方法定义、条件语句(if)、返回语句(return)等。

7. 递归栈(Recursive Stack):

  • 虽然代码中没有显式使用栈数据结构,但递归函数在调用时会使用调用栈来存储每一层递归的状态。

三、迭代方法

(一)解题思路

  1. 初始化一个空栈和一个空列表。
  2. 将根节点及其所有左子节点入栈。
  3. 弹出栈顶元素,将其值添加到结果列表中。
  4. 将弹出节点的右子节点及其所有左子节点入栈。
  5. 重复步骤3和4,直到栈为空。

(二)具体代码

import java.util.Stack;class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode current = root;while (current != null || !stack.isEmpty()) {while (current != null) {stack.push(current);current = current.left;}current = stack.pop();result.add(current.val);current = current.right;}return result;}
}

(三)时间复杂度和空间复杂度

1. 时间复杂度
  • 中序遍历需要访问二叉树中的每个节点一次,因此时间复杂度与二叉树中节点的数量成正比。
  • 在这个算法中,每个节点都会被访问一次,所以时间复杂度是 O(n),其中 n 是二叉树中的节点数。
2. 空间复杂度
  • 空间复杂度主要取决于迭代过程中使用的栈的大小。
  • 在最坏的情况下,树完全不平衡,每个节点都只有左子节点或者只有右子节点,栈的大小会达到节点数 n,因此空间复杂度为 O(n)。
  • 在最好的情况下,树是完全平衡的,栈的大小是 log(n),因此空间复杂度为 O(log(n))。
  • 综合考虑,空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n)),平均情况下则介于两者之间。

综上所述,这段代码的时间复杂度是 O(n),空间复杂度在最坏情况下是 O(n),在最好情况下是 O(log(n))。

(四)总结知识点

1. 迭代(Iteration):

  • 代码使用了一个循环结构来迭代地遍历二叉树的节点,而不是使用递归。

2. 栈(Stack)数据结构:

  • 代码使用了一个 Stack 来存储访问过的节点,以便后续能够按照正确的顺序访问它们的右子节点。
  • 栈是一种后进先出(LIFO)的数据结构,非常适合用于这种需要回溯的场景。

3. 二叉树(Binary Tree):

  • 代码操作的数据结构是二叉树,每个节点包含一个值和指向左右子节点的引用。
  • 二叉树是一种基础的数据结构,常用于各种算法问题。

4. 二叉树的中序遍历(Inorder Traversal of a Binary Tree):

  • 中序遍历是一种遍历二叉树的方法,按照“左-根-右”的顺序访问每个节点。
  • 这是二叉树遍历的三种基本方法之一(其他两种是前序遍历和后序遍历)。

5. Java 集合框架(Java Collections Framework):

  • 代码使用了 ArrayList 来存储遍历的结果,这是 Java 集合框架中的一个类。
  • ArrayList 是一个可调整大小的数组实现,提供了对元素的快速随机访问。
  • 同时,代码使用了 Stack 类来实现栈数据结构。

6. 循环和条件语句(Loop and Conditional Statements):

  • 代码使用了 while 循环来迭代遍历树节点,并使用了 if 语句来检查当前节点是否为空。

7. 函数定义和调用(Function Definition and Invocation):

  • 代码定义了一个公共方法 inorderTraversal,供外部调用。

8. 基本语法(Basic Syntax):

  • 代码使用了基本的 Java 语法,如类定义、方法定义、循环结构、条件语句等。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325811.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统&#xff0c;简单的说就是一个软件&#xff0c;用于记录一个或若干个文件内容变化&#xff0c;以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站&#xff0c;简单说就是一个可以放代码的地方。Gi…

韩顺平0基础学Java——第10天

p202-233 类与对象&#xff08;第七章&#xff09; 成员方法 person类中的speak方法&#xff1a; 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak&#xff08;&#xff09;中&#xff0c;speak表示方法名&#xff0c;括号是形参列表。 4.大括号为方法体&am…

重塑数据架构:云器Lakehouse如何简化组装式架构实现性能与成本的精益平衡

导读本文将介绍云器科技自研的 Lakehouse 产品。通过本次分享&#xff0c;您将了解云器 Lakehouse 产品特性&#xff0c;了解一体化数据平台如何提升数据处理和数据分析的效率&#xff0c;使之更轻松、更简洁、更高效&#xff0c;了解增量计算如何做到平衡数据新鲜度、查询性能…

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式 Python和其他一些高级面向对象的编程语言中&#xff0c;子类可继承父类中的方法&#xff0c;而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法&#xff0c;而是想作一定的修改&…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了&#xff0c;ubuntu24.04&#xff0c; 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前&#xff0c;虽然物质基础提高了&#xff0c;功能有独立进行编译、代码管理的服务器了。可以通过ssh登录&#xff0c;但是…

【C++11】C++11类与模板语法的完善

目录 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 1-2&#xff0c;强制生成关键字 二&#xff0c;可变参数模板 2-1&#xff0c;模板参数包 2-2&#xff0c;STL容器empalce的相关接口 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 C11之前的类中有…

Tomcat添加服务以及设置开机自启

下载地址连接 Index of /dist/tomcat&#x1f453; 注意点&#xff1a;不要出现中文路径 #环境变量 CATALINA_HOMED:\apache-tomcat-7.0.62 TOMCAT_HOMED:\apache-tomcat-7.0.62 JAVA_HOMED:\tool\jdk1.8.0_111 PATH%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\…

对称加密介绍

一、什么是对称加密 对称密钥算法(Symmetric-key algorithm)&#xff0c;又称为对称加密、私钥加密、共享密钥加密&#xff0c;是密码学中的一类加密算法。 对称加密的特点是&#xff0c;在加密和解密时使用相同的密钥&#xff0c;或是使用两个可以简单地相互推算的密钥。 这…

超越传统游戏:生成式人工智能对游戏的变革性影响

人工智能&#xff08;AI&#xff09;在游戏中的应用 游戏产业是一个充满活力、不断发展的领域&#xff0c;人工智能&#xff08;AI&#xff09;的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…

网络安全之弱口令与命令爆破(下篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;九头蛇&#xff08;hydra&#xff09;弱口令爆破工具 1&#xff0c;破解ssh登录密码 2&#xff0c;破解windows登录密码 3&#xf…

java项目之相亲网站的设计与实现源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的相亲网站的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 相亲网站的设计与实…

Excel办公技巧之下拉菜单

在日常办工中&#xff0c;经常需在单元格中输入特定的值&#xff0c;此时我们可以使用下拉菜单解决&#xff0c;输入错误和错误值&#xff0c;可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时&#xff0c;它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

权限及权限操作

1.命令行解释器 Linux将命令行解释器称为外壳程序shell 命令行解释器的作用就是将用户输入的指令转换为操作系统能够直接执行的指令。同时将操作系统的反馈转换为用户能看懂的反馈&#xff0c;解决了用户和操作系统沟通成本的问题。与此同时&#xff0c;命令行解释器还能够拦…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游&#xff0c;可以带动乡村相关产业的发展&#xff0c;提高乡村居民的收入&#xff0c;促进乡村的经济发展和社会进步。此外&#xff0c;乡村旅游还能促进城乡交流&#xff0c;推动城乡统筹发展。 数据…

rt-thread 挂载romfs与ramfs

参考&#xff1a; https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id%e4%bd%bf%e7%94%a8-romfs https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutor…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站&#xff0c;包括外贸企业网站、个人博客网站、中小企业官网等&#xff0c;那么作为新手不知道哪家香港虚拟主机好用的时候&#xff0c;该如何找到可以试用的香港虚拟主机呢&#xff1f; 香港虚拟主机也称作香港空间、香港虚拟空间&#xff0c;…

DS:时间复杂度和空间复杂度

欢迎各位来到 Harper.Lee 的学习世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本片博客主要介绍的是数据结构中关于算法的时间复杂度和空间复杂度的概念。 一、算法 1.1 什么是算法&#xff1f; 算法(Alg…

QT--2

Qt界面设计 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(680,520);this->setFixedSize(680,520);this->setWindowTitle("Tim");this->setWindowFla…