二叉树的中序遍历三种解法(递归+迭代+线索化)

news2024/12/25 13:23:58

文章目录

  • 递归
  • 迭代
  • 线索二叉树解法

传送门:
添加链接描述
给你一颗二叉树,让你实现中序的遍历

递归

递归没什么好说的,直接无脑递归即可,时间复杂度:O(n),空间复杂度:O(n)

class Solution {
public:
    void midtravel(TreeNode* root,vector<int>& res)
    {
    	//当节点不为空的时候,递归下去,直到节点为空,则返回上一层,紧接处理节点
        if (root!=nullptr)
        {
            midtravel(root->left,res);
            res.push_back(root->val);
            midtravel(root->right,res);
        }
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        midtravel(root,res);
        return res;
    }
};

迭代

迭代与递归的本质其实是一致的:利用栈来维护每一个节点,只不过递归是隐式的维护了一个栈,而迭代需要你显式的维护一个栈。

图解:

pstack:栈,维护每层的节点
res:vector< int > 存储返回结果

  1. 利用一个栈维护每个节点,当节点的left不为空,则一直入栈,直到到达了叶子节点。则把栈顶元素弹出,加入到res中,同时弹出pop栈顶元素,接着遍历它的右子树。
    在这里插入图片描述
  2. 节点3的右子树为空,下一步接着弹出栈顶元素,弹出节点2,然后加入到res中,接着遍历弹出的这个节点的右子树,即为4,4节点不为空,所以把节点4入栈,接着遍历节点4的右子树。

在这里插入图片描述
3. 节点4的右子树为空,弹出栈顶元素,弹出节点4,然后加入到res中,此时栈中只剩下了根节点1,弹出节点1,遍历根节点1的右子树,执行同样的操作。

在这里插入图片描述


class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> pstack;
        vector<int> res;
        while (root!=nullptr || !pstack.empty())
        {
            while (root!=nullptr)
            {
                pstack.push(root);
                root=root->left;
            }
            root=pstack.top();
            pstack.pop();
            res.push_back(root->val);
            root=root->right;
        }
        return res;
    }
};

线索二叉树解法

关于线索二叉树的原理及创建,可以看我这篇博客:
线索二叉树的创建解析

线索二叉树提供了无需递归便可以回到以前的节点的方法。
因为线索二叉树的左右指针保存了其当前节点的前驱节点与后继节点的指针,所以可以根据这个线索直接回到之前,不使用栈便可以实现这一操作。


具体实现:

  • 当前节点 x 的左子树为空: 将 x 添加到res中,x=x->right

  • 当前节点 x 的左子树不为空: 找到其左子树的最右端的节点,称作threadnode(当前左子树的中序遍历的最后的一个节点,这个节点即是x的left,然后一直往right,直到到达终点的那个节点)。

    • threadnode的右指针为空,threadnode -> right = 当前节点x,x=x->left
    • threadnode的右指针不为空,threadnode->right = nullptr,当前节点 x=x->right,x加入到res

图解:

  1. x在根节点经过三次往左移动到达节点3的位置,同时进行了两次线索的连接:节点4右指针连接根节点;节点3右指针连接节点2。相当于保存了回去的位置
    在这里插入图片描述
  2. x此时位于节点3的位置,它的left等于空所以把x放入res中,x=x->right,x现在到了节点2的位置(由线索的right保存了节点2的位置)。紧接着再次找到节点2的左子树的最右节点threadnode,断开线索的连接,把x(当前是节点2)放入res中,然后继续遍历其右子树。
    在这里插入图片描述
  3. x到达节点4的位置,节点4的left为空,因此把节点4放入到res中,x=x->right(由threadnode右指针线索了原根节点的位置),所以x又回到了根节点1的位置;紧接着再次找到根节点1的左子树的最右节点threadnode,断开线索的连接,把x(当前位于根节点1)放入到res中,然后继续遍历右子树。。。。
    在这里插入图片描述

代码示例:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        while (root!=nullptr)
        {
            if (root->left!=nullptr)
            {
            	//寻找每个节点对应的左子树的最右节点
                TreeNode* threadnode=root->left;
                while (threadnode->right!=nullptr && threadnode->right!=root)
                {
                    threadnode=threadnode->right;
                }
                if (threadnode->right==nullptr)
                {
                    //右指针线索化
                    threadnode->right=root;
                    root=root->left;
                }
                else
                {
                	//取消线索化
                    res.push_back(root->val);
                    threadnode->right=nullptr;
                    root=root->right;
                }
            }
            else
            {
            	//到达了某个具有线索的节点,存储与回溯
                res.push_back(root->val);
                root=root->right;   //保存的线索
            }
        }
        return res;
    }
};

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

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

相关文章

搭建环境AI画图stable-diffusion

目录简介环境准备安装conda(方式1)安装conda&#xff08;方式2&#xff0c;推荐&#xff09;验证conda安装成功安装stable-diffusion的环境简介 本文旨在记录过程&#xff0c;偶然看见一个AI画图的&#xff0c;体验看看。 stable-diffusion是一个输入简单图片&#xff0c;输出…

【Java难点攻克】「Guava RateLimiter」针对于限流器的入门到实战和源码原理分析

限流器的思路和算法 如果让你来造一个限流器&#xff0c;有啥想法&#xff1f; 漏桶算法 用一个固定大小的队列。比如设置限流为5qps&#xff0c;1s可以接受5个请求&#xff1b;那我们就造一个大小为5的队列&#xff0c;如果队列为满了&#xff0c;就拒绝请求&#xff1b;如…

JRebelXRebel的配置和使用(进阶篇)

JRebel&XRebel的配置和使用嘚吧嘚设置JRebel快捷键XRebel使用嘚吧嘚 之前简单介绍了JRebel&XRebel的安装和使用&#xff0c;不了解的朋友可以补补课&#x1f606;。 JRebel&XRebel这款插件不仅仅可以用来热部署&#xff0c;所以继续分享一下这款插件的相关使用&a…

12月2日(第四天)

使用myabtis自动生成的时候&#xff0c;发现xml文件只会merge不会覆盖&#xff0c;这时候需要使用插件&#xff1a; <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />MyBatis Generator配置文件context元素的defaultModelType属性…

封装window10-21H1踩的坑,无法分析或处理pass[specialize]应答文件

最近在研究封装镜像&#xff0c;无奈公司不给用win11&#xff0c;只能封装win10 2022年全新Windows11系统封装图文教程&#xff08;一&#xff09;定制母盘 - 小鱼儿yr系统 (yrxitong.com) 坑1&#xff0c;封装好出现无法分析或处理pass[specialize]应答文件 解决办法&#x…

Java基础:String类、static关键字、Arrays类、Math类

第一章 String类 1.1 String类概述 概述 java.lang.String类代表字符串。Java程序中所有的字符串文字&#xff08;例如"abc"&#xff09;都可以被看作是实现此类的实例。 类String中包括用于检查各个字符串的方法&#xff0c;比如用于比较字符串&#xff0c;搜索…

[附源码]计算机毕业设计JAVA新冠疫苗线上预约系统

[附源码]计算机毕业设计JAVA新冠疫苗线上预约系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Web3.0 DApp(去中心化应用程序)设计架构

先来回顾下 Web2.0 应用程序架构&#xff0c;一图胜千言&#xff1a; 图示是对大多数 Web 2.0 应用程序如何工作的一个很好的抽象总结。以一个博客平台为例&#xff1a; 首先&#xff0c;必须有一个地方来存储基本数据&#xff0c;也就是数据库&#xff1b; 其次&#xff0c;…

快速串联 RNN / LSTM / Attention / transformer / BERT / GPT(未完待续)

参考&#xff1a; 李宏毅2021/2022春机器学习课程王树森 RNN & Transformer 教程 文章目录0. 背景&#xff1a;序列数据及相关任务1. 早期序列模型1.1 循环神经网络 RNN1.2 长短期记忆网络 LSTM1.3 改善 RNN/LSTM 的三个技巧1.3.1 通过堆叠扩展为深度模型1.3.2 使用双向模…

使用学校的服务器跑深度学习

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利完…

原型工具与代码实现的差距及改进设想

背景 最近经常根据墨刀设计的原型开发微信小程序页面&#xff0c;使用的多了总感觉原型只能参考&#xff0c;原型跟代码实现总差一小步。原型中提供的CSS并不能直接复制到代码中&#xff0c;导致编码人员复刻原型设计时总有差距。本文先列举出一些原型和实现的差距&#xff0c;…

RS232/RS485信号转12路模拟信号 隔离D/A转换器YL34

特点&#xff1a; ● RS-485/232接口&#xff0c;隔离转换成12路标准模拟信号输出 ● 可选型输出4-20mA或0-10V控制其他设备 ● 模拟信号输出精度优于 0.2% ● 可以程控校准模块输出精度 ● 信号输出 / 通讯接口之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;10 ~ 3…

信息收集的工具简介和常见操作

目录 前言 域名信息 工具 子域名信息 工具 域名DNS解析信息 工具 ip信息 工具 CDN绕过 方法 工具 端口服务信息 常见端口总结 基本概念 扫描工具 指纹识别 识别对象 cms指纹识别 识别思路 工具 其他工具 cdn识别 常用工具 waf识别 触发 工具 Google…

营业利润里首次突破两位数,瑞幸能否延续神话?

近期&#xff0c;瑞幸咖啡公布了Q3财报&#xff0c;三季度继续延续了上半年良好的增长势能。总净收入39亿元&#xff0c;同比增长65.7%&#xff0c;营业利润率首次突破双位数达到了15%。 门店数量增长&#xff1a;Q3新增651家&#xff0c;达到7846家门店。从开店节奏看&#…

RCNN算法思想简单讲解概述————(究极简单的讲述和理解)

学习的过程中发现一个问题&#xff0c;如果不能大概的了解一下一个算法的思想直接去看他的论文&#xff0c;或者去看他算法的讲解就很痛苦&#xff0c;看不懂&#xff0c;学的效率也非常低&#xff0c;类似我之前发的RCNN论文精度的博客。RCNN目标检测算法内容详解&#xff08;…

FreeIPA 统一身份认证实现

1、FreeIPA 简介 FreeIPA是一个用于Linux/Unix环境开源的身份管理系统,提供集中式帐户管理和身份验证,与Windows Active Directory或LDAP的作用类似。FreeIPA集成了389目录服务器、MIT Kerberos、Apache HTTP服务器、NTP、DNS、Dogtag(证书系统)和SSSD,使其成为标识管理、…

使用Flink的各种技术实现WordCount逻辑

使用Flink的各种技术实现WordCount逻辑 在大数据程序中&#xff0c;WordCount程序实现了统计词频的作用&#xff0c;这个WordCount程序也往往在大数据分析处理中一直占着非常重要的地位。统计一天内某网站的访问次数&#xff0c;需要对网站排序后求其词频&#xff0c;统计一段…

【智能电网随机调度】智能电网的双层模型时间尺度随机优化调度(Matlab代码实现)

目录 1 概述 2 数学模型 3 运行结果 4 结论 5 参考文献 6 Matlab代码实现 1 概述 随着可再生能源发电量的增加&#xff0c;配电网的能源管理正成为一项计算上具有挑战性的任务。来自光伏&#xff08;PV&#xff09;装置的太阳能可以在一分钟内发生显着变化。可以命令光伏…

MongoDB安装Mac M1

1、下载安装包&#xff1a; axInstall MongoDB Community Edition on macOS — MongoDB Manualhttps://www.mongodb.com/docs/v6.0/tutorial/install-mongodb-on-os-x/下载解压&#xff0c;重命名为mongodb 放到 /usr/local 目录下 2、配置文件打开配置文件 open -e .bash_p…

java计算机毕业设计ssm某大学校园竞赛管理系统07494(附源码、数据库)

java计算机毕业设计ssm某大学校园竞赛管理系统07494&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…