【LeetCode】二叉树的中序遍历(递归,迭代,Morris遍历)

目录

题目要求:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

方法一:递归

方法二:迭代

思路分析:

复杂度分析

代码展示:

方法三:Morris 遍历

思路分析:

复杂度分析

代码展示:


题目要求:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

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

提示:

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

 

方法一:递归

递归的方法二叉树的前序遍历在之前的博客中已经写过,需要的小伙伴可以点击链接查看

递归求二叉树的前中后序遍历

【LeetCode】二叉树的前序遍历(递归,迭代,Morris遍历)

这篇文章主要来讲解非递归的方法对二叉树进行中序遍历

方法二:迭代

思路分析:


迭代的方式其实与递归是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候

需要显式地将这个栈模拟出来,其余的实现与细节都相同,具体可以参考下面的代码

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为迭代过程中显式栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)

代码展示:

 public List<Integer> inorderTraversal(TreeNode root) {
        List <Integer> list = new ArrayList<>();
        Stack <TreeNode> stack = new Stack<>();

        //栈非空或者root非空
        while(root != null || !stack.isEmpty()){
            //先根后左入栈
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            //此时root为空,说明上一个入栈的root没有左子树
            //没有左子树,可以出栈
            root = stack.pop();
            list.add(root.val);
            //此时判断右子树
            root = root.right;
        }
        return list;
    }

方法三:Morris 遍历

Morris 遍历使用二叉树节点中大量指向 null 的指针,由 Joseph Morris 于 1979 年发明。

思路分析:

将当前根节点的左侧最右侧节点的right指向当前根节点,省去了栈的维护,连接之后可以直接顺着节点遍历完整个二叉树,以下图为例:

6f9c88bc38954a898dd01d66029bf510.jpeg

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(1)

代码展示:

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        TreeNode cur1 = root;
        TreeNode cur2 = null;
        while(cur1 != null){
            cur2 = cur1.left;
            if(cur2 != null){
                while(cur2.right != null && cur2.right != cur1){
                    cur2 = cur2.right;
                }
                //此时说明cur2走向了最右侧子树
                //1.还未连接,建立连接
                if(cur2.right != cur1){
                    cur2.right = cur1;
                    cur1 = cur1.left;
                    continue;
                //否则说明已经走过,断开连接
                }else{
                    cur2.right = null;
                    list.add(cur1.val);
                }
            }else{
                list.add(cur1.val);
            }

            cur1 = cur1.right;
        }
        return list;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3学习笔记(9.1)

Vue.js style&#xff08;内联样式&#xff09; 我们可以在v-bind:style直接设置样式&#xff0c;可以简写:style <!--* Author: RealRoad1083425287qq.com* Date: 2023-04-02 19:41:53* LastEditors: Mei* LastEditTime: 2023-04-03 15:41:44* FilePath: \vscode\Vue3_li…

打气球游戏-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第118讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

Java包装类

包装类1. 包装类&#xff08;Wrapper&#xff09;1.1 基本数据类型和包装类之间的转换1.2 String类和包装类&#xff08;基本数据类型&#xff09;之间的转换2. 面试题3.包装类练习1. 包装类&#xff08;Wrapper&#xff09; 继承于java.lang.Number类&#xff1b;实现了java.…

java校园行为分析预警管理系统

目 录 摘 要 II ABSTRACT III 第一章 绪论 1 1.1研究背景 1 1.2选题目的 1 1.3本文研究内容 2 第二章 开发技术介绍 3 2.1开发工具介绍 3 2.2 JAVA技术介绍 3 2.3 MYSQL数据库介绍 4 第三章 系统需求分析 6 3.1可行性分析 6 3.1.1技术…

python之lambdas函数(lambda表达式)

python之lambdas函数&#xff08;lambda表达式&#xff09; lambda函数&#xff0c;也称为lambda表达式。 lambda函数&#xff08;或lambda表达式&#xff09;的语法&#xff1a; lambda arguments: expression 创建一个返回表达式值的匿名函数。其中&#xff1a; lambda 是…

Power Apps从入门到放弃教程

Power Apps从入门到放弃教程前言啥是Power apps文档资料官方文档官方公式文档官方控件文档案例实操添加数据源用户登录登录成功,跳转主界面添加组件提示语言流前言 Hello&#xff01;欢迎各位,当你选择阅读这篇文章时&#xff0c;相信你最近也在学习Power apps&#xff0c;并且…

Debian 达梦数据库 disql工具输入命令 左右移动光标乱码

Debian 达梦数据库 disql工具输入命令 左右移动光标乱码1、下载安装包rlwrap-0.46.12、编译安装rlwrap-0.46.12.1、安装依赖包2.2、编译安装2.3、安装成功3、设置rlwrap系统环境变量4、配置达梦护数据库用户环境变量5、测试效果1、下载安装包rlwrap-0.46.1 https://github.com…

K8s (一) --------- K8s 概述

目录一、kubernetes 基本介绍二、kubernetes 功能和架构1. 概述2. K8s 功能:3. 应用部署架构分类4. K8s 集群架构5. K8s 集群架构节点角色功能一、kubernetes 基本介绍 kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的&…

【数据结构】二叉树<遍历>

【二叉树遍历】|-前序-中序-后序-层序-|<二叉树的遍历>1.前序遍历【递归】2.中序遍历【递归】3.后序遍历【递归】4.层序遍历【非递归】4.1判断是否是完全二叉树<二叉树的遍历> 在学习二叉树遍历之前我们先了解下二叉树的概念。 二叉树是&#xff1a; 1.空树 2.非空…

最新 MySQL 8.0.32 在Win10安装部署(详细)

一、前言 MySQL官方Windows版下载地址&#xff1a;https://dev.mysql.com/downloads/installer/   本教程详细指导如何在Win10系统下安装部署最新版MySQL-8.0.32。   【MySQL系列安装部署教程】 Docker安装最新版MySQL5.7&#xff08;mysql-5.7.40&#xff09;教程&…

漫画党的福利——将图片转换成漫画风格 API,附超多免费可用API 推荐(四)

前言 今天来和大家聊聊一件非常有趣的事情——将图片转换成漫画风格的 API&#xff01;如果你是一个漫画党&#xff0c;相信这个话题一定会让你感到兴奋。通过这个 API&#xff0c;你可以将你的照片变成漫画风格&#xff0c;让它们变得更加有趣和艺术&#xff01; 我们先来看…

24《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限&#xff0c;如果错误欢迎批评指正。 第六章&#xff1a;The principles of protein folding kinetics &#xff08;蛋白质折叠动力学的原理&#xff09; -Levinthal悖论促进蛋白质折…

pyecharts实现电影数据分析可视化

根据电影数据&#xff0c;使用pyecharts进行可视化分析。 数据介绍 import pandas as pd datapd.read_csv(./电影.csv) data.head()前5行数据如下: 需要安装的python库 pip install pandas pip install pyecharts文章目录数据介绍数据清洗数据可视化上映年份及电影数量导演…

python 数据、曲线平滑处理——基于Numpy.convolve实现滑动平均滤波——详解

文章目录1 基于Numpy.convolve实现滑动平均滤波1.1 滑动平均概念1.2 滑动平均的数学原理1.3 语法1.4 滑动平均滤波示例2 曲线平滑处理——Savitzky-Golay 滤波器——详解3 基于Numpy.convolve实现滑动平均滤波——详解1 基于Numpy.convolve实现滑动平均滤波 1.1 滑动平均概念 …

linux 配置java环境

1、上传jdk包到/usr/local/java目录下 2、解压jdk的tar包 tar -zxvf jdk-8u291-linux-x64.tar.gz 3、添加配置&#xff08;环境变量&#xff09; 注意&#xff1a;JAVA_HOME值为实际jdk路径 打开配置文件 vi /etc/profile 最下面添加: #set java environment JAVA_HOME/usr/…

基于集成学习的用户流失预测并利用shap进行特征解释

基于集成学习的用户流失预测并利用shap进行特征解释 小P&#xff1a;小H&#xff0c;如果我只想尽可能的提高准确率&#xff0c;有什么好的办法吗&#xff1f; 小H&#xff1a;优化数据、调参侠、集成学习都可以啊 小P&#xff1a;什么是集成学习啊&#xff0c;听起来就很厉害的…

SSM—【笔记】1.2 SpringMVC

SpringMVC:用于表现层开发&#xff0c;同Servlet功能等同&#xff0c;但比Servlet技术使用更加简便&#xff0c;可以用更少代码量完成开发 项目结构&#xff1a; 后端采用的是三层架构模式&#xff1a; 数据层&#xff1a;先学的JDBC技术&#xff0c;后用MyBatis框架取代 表…

ThreeJS-缩放、旋转(四)

代码&#xff1a; <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {OrbitControls } from three/examples/jsm/controls/OrbitControls export default { name: &quo…

在华为做了三年软件测试被裁了,我该怎么办

近年来&#xff0c;随着经济环境的变化和企业战略的调整&#xff0c;员工被裁员的情况变得越来越普遍。无论是因为企业经营困难还是因为业务调整&#xff0c;员工们都可能面临被裁员的风险。如果你也遇到了这样的情况&#xff0c;那么你应该怎么办呢&#xff1f; 首先&#xf…

centos7 SystemV 开机自启动脚本配置方法 redis集群三主三从

centos7 SystemV 开机自启动脚本配置方法 redis集群三主三从1、安装redis集群2、编写redis启动脚本2.1、建立启动脚本2.2、复制多份redis启动脚本给集群使用2.3、添加可执行权限3、配置开机自启动1、安装redis集群 参考: redis三主三从集群安装 2、编写redis启动脚本 2.1、建…