94. 二叉树的中序遍历

news2024/10/2 1:31:39

94. 二叉树的中序遍历

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

首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。

方法一:递归

思路与算法

首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

定义 inorder(root) 表示当前遍历到 \textit{root}root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 \textit{root}root 节点的左子树,然后将 \textit{root}root 节点的值加入答案,再递归调用inorder(root.right) 来遍历 \textit{root}root 节点的右子树即可,递归终止的条件为碰到空节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//方法一:递归
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();//用来存中序遍历的结果
        inorder(root, res);
        return res;
    }

    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) { //先判断当前节点是否存在树
            return;
        }
        inorder(root.left, res);//访问左节点去遍历左子树
        res.add(root.val);
        inorder(root.right, res);//访问右节点去遍历右子树
    }
}

复杂度分析

时间复杂度:O(n),其中 n 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。

空间复杂度:O(n)。空间复杂度取决于递归的栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n) 的级别。

方法二:迭代

思路与算法

方法一的递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同,具体实现可以看下面的代码。

简单介绍一下:

push 函数介绍_push函数_poptar的博客-CSDN博客

Deque:在队列的两端都能进出的队列,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。

Deque的使用详解_C2980C的博客-CSDN博客

 //方法二:迭代
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Deque<TreeNode> stk = new LinkedList<TreeNode>();
        while (root != null || !stk.isEmpty()) {
            while (root != null) {
                stk.push(root);//入栈
                root = root.left;//把左节点作为根节点
            }
            root = stk.pop();//出栈
            res.add(root.val);
            root = root.right;//左节点遍历完了,把左右节点作为根节点
        }
        return res;
    }
}

复杂度分析

时间复杂度:O(n),其中 n 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。

空间复杂度:O(n)。空间复杂度取决于栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n)的级别。

还有一个方法三。我懒得看了啦先这样吧这个算法题。

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

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

相关文章

MQTT协议-订阅主题和订阅确认

MQTT协议-订阅主题和订阅确认 SUBSCRIBE——订阅主题 订阅是客户端向服务端订阅 订阅报文 订阅报文与CONNECT报文类似&#xff0c;都是由固定报头可变报头有效载荷组成 固定报头比较简单&#xff0c;也是由两个字节组成&#xff0c;第一个字节为82&#xff0c;第二个字节是…

像素密度提升33%,Quest Pro动态注视点渲染原理详解

在Connect 2022上&#xff0c;Meta发布了Quest Pro&#xff0c;并首次在VR中引入动态注视点渲染&#xff08;ETFR&#xff09;功能&#xff0c;这是一种新型图形优化技术&#xff0c;特点是以用户注视点为中心&#xff0c;动态调节VR屏幕的清晰度&#xff08;注视点中心最清晰、…

Oracle VM VirtualBox6.1.36导入ova虚拟机文件报错,代码: E_INVALIDARG (0x80070057)

问题 运维人员去客户现场部署应用服务&#xff0c;客户是windows server 服务器&#xff08;客户不想买新机器&#xff09;&#xff0c;我们程序是在linux系统里运行&#xff08;其实windows也可以&#xff0c;主要是为了保持各地环境一致方便更新和排查问题&#xff09;我们使…

吐血整理学习方法,2年多功能测试成功进阶自动化测试,月薪23k+......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试进阶方向 测试进…

[Gin]框架底层实现理解(三)

1.engine.Run(port string) 这个就是gin框架的启动语句&#xff0c;看看就好了&#xff0c;下面我们解析一下那个engine.Handler() listenandserve 用于启动http包进行监听&#xff0c;获取链接conn // ListenAndServe listens on the TCP network address addr and then ca…

【SOP 】配电网故障重构方法研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java中wait和sleep区别

文章目录1. Java中wait和sleep区别2. wait和sleep所属方法的不同3. wait的Demo3.1 没有synchronized同步代码块异常3.2 wait使用Demo4. sleep的Demo1. Java中wait和sleep区别 sleep属于Thread类中的static方法&#xff1b;wait属于Object类的方法sleep时线程状态进入TIMED_WAI…

java 如何实现在线日志

如何采集springboot日志至web页面查看 实现方案 基于Filter方式,在日志输出至控制台前,LoggerFitler 拦截日志通过websocket推送至前台页面 实现逻辑&#xff1a; LoggerFilter采集日志添加至LoggerQueue队列, LoggerConsumer 从LoggerQueue中采集推送至前台页面 #mermaid-s…

LearnOpenGL-光照-3.材质

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject 文章目录材质例子1代码相关光照太强了例子2例子3: 不同的光源颜色材质 引出材质 如果我们想要在OpenGL中模拟…

TTS | 语音合成常见数据集及数据格式详情

linkLJSpeech网址 &#xff1a; The LJ Speech Dataset (keithito.com)数据集描述&#xff1a;数据集大小&#xff1a;2.6GB这是一个公共领域的语音数据集&#xff0c;由 13&#xff0c;100 个简短的音频剪辑组成 一位演讲者阅读 7 本非小说类书籍的段落。为每个剪辑提供转录。…

删除的文件怎么恢复?恢复方法在这里(支持Win和Mac)

案例&#xff1a;文件永久删除还能找回来吗&#xff1f;关于Win和Mac系统的恢复方法 “前几天我在清理电脑垃圾&#xff0c;不小心误删了重要的文件。有没有什么比较全面的方法&#xff0c;可以帮助我恢复删除的文件啊&#xff1f;在线急等回复&#xff01;” 随着电脑使用的…

Golang 中 Slice的分析与使用(含源码)

文章目录1、slice结构体2、slice初始化3、append操作4、slice截取5、slice深拷贝6、值传递还是引用传递参考文献众所周知&#xff0c;在golang中&#xff0c;slice&#xff08;切片&#xff09;是我们最常使用到的一种数据结构&#xff0c;是一种可变长度的数组&#xff0c;本篇…

三维人脸实践:基于Face3D的渲染、生成与重构 <二>

face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 3DMM方法&#xff0c;基于平均人脸模型&#xff0c;可广泛用于基于关键点的人脸生成、位姿检测以及渲染等&#xff0c;能够快速实现人脸建模与渲染。推…

MySQL基础篇3

第一章 多表关系实战 1.1 实战1&#xff1a;省和市 方案1&#xff1a;多张表&#xff0c;一对多 方案2&#xff1a;一张表&#xff0c;自关联一对多 id1 name‘北京’ p_id null; id2 name‘昌平’ p_id1 id3 name‘大兴’ p_id1 id3 name‘上海’ p_idnull id4 name‘浦东’…

中国人工智能企业中集飞瞳全球港航人工智能领军者,箱况残缺检测视频流动态感知智能闸口,自动化港口码头数字化智慧港航中国人工智能企业

中国人工智能企业中集飞瞳全球港航人工智能领军者&#xff0c;箱况残缺检测视频流动态感知超级智能闸口&#xff0c;自动化港口码头数字化智慧港航。CIMCAI已完成全球250万人工智能集装箱箱况检验&#xff0c;完成全球上亿集装箱信息&#xff0c;先进产品在全球各港区及集装箱枢…

CNStack 多集群服务:基于 OCM 打造完善的集群管理能力

作者&#xff1a;学靖 概述 随着 Kubernetes 在企业业务中的应用和发展&#xff0c;单集群内的管理能力已经趋于完善&#xff0c;越来越多的客户期望在多云、多集群场景部署其业务&#xff0c;因此需要提供相应的多云、多集群管理能力。 CNStack 多集群服务是 CNStack 面向多…

【实现“大图”功能 Objective-C语言】

一、这时候,我们来实现另外一个功能,就是点击,实现这个“大图”, 1.点击“大图”按钮,实现这个“大图”, 那么我先给大家说一下,这个点击“按钮”,实现“大图”,这个思路是怎样的,大家看一下,这个示例程序,当你点击“大图”的时候,首先,这个图片变大,同时,后…

Nvidia jetson nano 部署yolov5_技术文档

Nvidia jetson nano 部署yolov5_技术文档 每天一句小姜格言&#xff1a;我行&#xff0c;我不是一般人儿 部署开始&#xff1a; 1、通过FileZilla&#xff0c;将window文件传输至jetson nano 上的nano文件夹下。 2、查看cuda 我买的jetson nano是带有配置好的镜像。系统配置…

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 归并排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是…

嵌入式开发:CIA保护跨连接设备的嵌入式数据

在嵌入式开发中&#xff0c;ITTIA SDL保护数据并确保嵌入式系统的开发安全。嵌入式系统中的数据管理安全威胁是什么?ITTIA如何解决这个问题?嵌入式系统和企业系统的数据管理理想情况下遵循相同的安全威胁。有三个主要的基本原则或目标被称为CIA&#xff1a;保密性&#xff1a…