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

news2024/11/27 5:37:19

一、题目描述

给定一个二叉树的根节点 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.coloradmin.cn/o/1668951.html

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

相关文章

C++八股(面试题、手撕题)自用版

目录 面试题&#xff1a; 1. define inline 在编译的哪个阶段 2. const static 3. 子函数返回结构体有什么问题&#xff0c;返回对象调用了哪些函数 4. volatile关键字 5. 编译器基本原理 6. 预处理、编译、汇编、链接以及他们在操作系统上如何运作的 7. 数组和指针&a…

【HCIP学习】BGP对等体组、聚合、路由反射器、联盟、团体属性

一、大规模BGP网络所遇到的问题 BGP对等体众多&#xff0c;配置繁琐&#xff0c;维护管理难度大 BGP路由表庞大&#xff0c;对设备性能提出挑战 IBGP全连接&#xff0c;应用和管理BGP难度增加&#xff0c;邻居数量过多 路由变化频繁&#xff0c;导致路由更新频繁 二、解决大…

【python量化交易】qteasy使用教程07——创建更加复杂的自定义交易策略

创建更加复杂的自定义交易策略 使用交易策略类&#xff0c;创建更复杂的自定义策略开始前的准备工作本节的目标继承Strategy类&#xff0c;创建一个复杂的多因子选股策略策略和回测参数配置&#xff0c;并开始回测 本节回顾 使用交易策略类&#xff0c;创建更复杂的自定义策略 …

mapreduce | 自定义Partition分区(案例2)

1.需求 统计每个手机号消费总金额&#xff0c;按照消费金额降序排序&#xff0c;最终联通、电信、移动分别写入不同的文件。 130、131、132&#xff08;联通&#xff09; 133&#xff08;电信&#xff09; 135、136、137、138、139 &#xff08;移动&#xff09; 手机号,消费记…

MFC编程之设计美丽的对话框

目录 写在前面&#xff1a; Part 1&#xff1a;美美的设计一下计算器的布局 1.描述文字&#xff1a; ​编辑 2.ID&#xff1a; Part 2&#xff1a;美美熟悉一下计算器的工作流程 Part 3&#xff1a;美美设计一下控件功能 1.edit control&#xff1a; 2.相关变量初始化&…

2.分布式-算法

目录 一、限流算法有哪些&#xff1f; 1.计数器算法&#xff08;Counter-Based Algorithm&#xff09; 2.固定窗口算法&#xff08;Fixed Window&#xff09; 3.滑动窗口算法&#xff08;Sliding Window&#xff09; 4.令牌桶算法&#xff08;Token Bucket&#xff09; 5.…

PyQt5中的QtDesigner窗口

文章目录 1. 简介2. QtDesigner的MainWindow2.1 创建MainWindow2.2 添加组件2.3 预览2.4 查看对应的Python代码2.5 保存窗口并命名为login.ui&#xff0c;如下所示2.6对ui文件进行转换得到.py原件 3. 窗口常用属性及说明3.1 设置对象名称3.2 改变标题名字3.3 修改窗口大小 4. 更…

pdf 版面分析与优化策略

1. 简介 版面分析作为RAG的第一步工作&#xff0c;其效果对于下游工作至关重要。 前常见的 PDF 解析方法包括三种 基于规则&#xff1a;根据 PDF 的组织特征确定每个部分的规则&#xff08;风格和内容&#xff09;缺点&#xff1a;不通用&#xff08;PDF格式不固定&#xf…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月&#xff0c;NIST&#xff08;Nation Institute of Standards and Technology&#xff0c;美国国家标准技术研究所&#xff09;提出了数字签名算法&#xff08;DSA&#xff09;用于他们的数字签名标准&#xff08;DSS&#xff09;中。 DSA是算法&#xff0c…

C++的数据结构(四):队列

在数据结构中&#xff0c;队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作。队列中没有元素时&#xff0c;称为空队列。队列的…

python数据分析——matplotlib可视化基础

参考资料&#xff1a;活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt # 导入数据 anscombepd.read_csv(r"...\seaborn常用数据案例\anscombe.csv") anscombe.head() 大多数基本图表的名字以plt.plot开头。 # 创建数据子集 # 只包含数…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件&#xff0c;有需要要复习一下以前的东西&#xff0c;有需要的自取&#xff0c;强调一点&#xff0c;如果真的想了解透彻&#xff0c;一定要动手&#xff0c;脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机&#xff0c;装完如下图&#xff0c;我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64&#xff0c;可以从镜像站下载&#xff0c;官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

AI 问答 API 对接说明

我们知道&#xff0c;市面上一些问答 API 的对接还是相对没那么容易的&#xff0c;比如说 OpenAI 的 Chat Completions API&#xff0c;它有一个 messages 字段&#xff0c;如果要完成连续对话&#xff0c;需要我们把所有的上下文历史全部传递&#xff0c;同时还需要处理 Token…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照&#xff0c;并写道&#xff1a;「预祝各位#母亲节快乐&#x1f339;#dinner #happy #friends #好味」相中所见&#xff0c;前TVB金牌监制潘嘉德、卢宛茵、黄&#x28948;莹、黎萨达姆都有出席饭局。 当中黄&#x28948;莹身穿卡其色西装褛&…

【35分钟掌握金融风控策略24】定额策略实战

目录 基于客户风险评级的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于客户风险评级的定额策略 在开发定额策略时&#xff0c;精准确定客户的基础额度是一个关键步骤&#xff0c;通常会基于客户的收…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景&#xff0c;利用translate和opacity实现动效的移动和缩放&#xff0c;并将界面沉浸式&#xff08;全屏&#xff09;显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

【Linux】centos7安装软件(rpm、yum、编译安装),补充:查找命令的相关文件路径,yum安装mysql

【Linux】技术上&#xff0c;Linux是内核。而术语上&#xff0c;我们通常说的Linux是完整的操作系统&#xff0c;其实称为"Linux发行版"&#xff0c;是将Linux内核和应用系统打包&#xff0c;由不同的发行家族发行了不同版本。Linux发行版众多&#xff0c;主要有RedH…

HCIP-Datacom-ARST自选题库_07_割接【35道题】

一、单选题 1.在割接的测试阶段&#xff0c;符合以下哪一种情况的可以判断为割接成功? 网络承载的上层应用业务测试正常 网络设备的配置查看结果正常 网络流量路径正常 路由协议运行正常 2.在割接的测试阶段中&#xff0c;表明已经完成测试的标准是: IP设备的配置查看结…