图解Morris遍历

news2024/11/25 7:51:16

1. 简述

morris遍历是不借助栈空间实现二叉树遍历的一种方法。

其核心思想是,利用当前节点左子树的最右叶子节点当索引节点。

即中序遍历的前驱节点。

第一次遍历根节点的时候,找到该节点,将该节点右儿子指向根节点。

第二次回到该节点时,将前驱标记给删除掉。

2. 图解过程

在这里插入图片描述

3. 代码实现

前序遍历与中序遍历都符合前驱的建立过程,而后序则复杂些。

后序遍历加入的是左子树根节点到左子树最右子节点的所有节点的逆序。

所以对于后序遍历来说,过程是这样的。

在这里插入图片描述

3.1 前序遍历

void PreOrderMorris(node *root)
{

    while ( root ) {

        if ( root->left != NULL) {
            node *preNode = root->left;

            while ( preNode->right != nullptr && preNode->right != root)
                preNode = preNode->right;
            if ( preNode->right == nullptr) {
                preNode->right = root;
                std::cout << root->val << ' ';
                root = root->left;
            }
            else {
                preNode->right = nullptr;
                root = root->right;
            }
        }
        else {
            std::cout << root->val << ' ';
            root = root->right;
        }
    }

    std::cout << "\n";
}
3.2 中序遍历
void InOrderMorris(node *root)
{

    while (root)
    {
        if ( root->left ) {
            node *preNode = root->left;

            while ( preNode->right != nullptr && preNode->right != root) {
                preNode = preNode->right;
            }

            if ( preNode->right == nullptr ) {
                preNode->right = root;
                root = root->left;
            }
            else {
                std::cout << root->val << " ";
                preNode ->right = nullptr;
                root = root->right;
            }
        }
        else {
            std::cout << root->val << " ";
            root = root->right;
        }
    }

    std::cout << "\n";
}
3.3 后序遍历
void addPath(node *root, std::vector<int> &seq)
{

    int count = 0;

    while (root)
    {
        ++count;
        seq.emplace_back(root->val);
        root = root->right;
    }

    std::reverse(seq.rbegin(), seq.rbegin() + count);
}
void PostOrderMorris(node *rt, std::vector<int> &seq)
{

    node *root = rt;
    while (root)
    {
        if ( root->left) {
        	// 是否存在左子树
            node *preNode = root->left;

            while (preNode->right && preNode->right != root) {
                preNode = preNode->right;
            }
            if ( preNode->right) {
            	// 第二次遍历
                preNode->right = nullptr;
                // 先断链
                addPath(root->left, seq);
                root = root->right;
            }
            else {
            	// 第一次遍历标记后继
                preNode->right = root;
                root = root->left;
            }
        }
        else {
        	// 不存在即遍历右子树
            root = root->right;
        }
    }
    addPath(rt, seq);

}

Ref

leetcode

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

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

相关文章

什么是指纹浏览器?——社媒营销多账号的管理神器

对于跨境卖家来说&#xff0c;通过海外社媒平台进行引流推广是不错的选择&#xff0c;但在实际操作中我们总会遇到很多问题。比如老手们肯定都经历过多个账号被封禁的情况&#xff0c;如果你也跟以前的东哥一样困扰怎么在一台电脑登录同平台多个账号&#xff0c;那今天这篇文章…

下载并安装DevEco Studio 3.1,初尝鸿蒙编程

摘自华为官网 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发&#xff0c;提供了代码智能编辑、低代码开发、双向预览等功能&#xff0c;以及轻量构建工具DevEco Hvigor 、本地模拟器&#xff0c;持续提升应用及服务开发效率。 下载 官网下载地址 HUAWEI…

2023年云计算的发展趋势

随着互联网和信息技术的快速发展&#xff0c;云计算已经成为了企业和个人的重要工具&#xff0c;而在未来&#xff0c;云计算仍然会持续发展&#xff0c;并且发展趋势会更加迅猛。在本文中&#xff0c;我们将讨论2023年云计算的发展趋势。 一、混合云将成为主流 混合云是指将公…

任正非说:流程主要是为一线作战服务,流程是手段,支撑一线、服务市场才是目的。

你好&#xff01;这是华研荟【任正非说】系列的第37篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 华研荟注&#xff1a;昨天的任正非先生讲话主要谈了IPD、ISC两个主业务流程&#xff0c;今天主要来看看任正非先生关于LTC的一…

企业微信后台通过小程序给员工发送文字信息附带超链接实现(加上A标签:<a href=“网址“> </a>)

如下&#xff0c;在编辑文本消息的时候&#xff0c;添加上HTML的A标签 <a href"www.baidu"> </a>即可实现点击直接跳转

uniapp: 实现pdf预览功能

目录 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 2.2 解决需求 2.2.1 方法一 2.2.2 方法二 第三章 资源下载 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 前端需要利用后端传的pdf临时路径实现H5端以及app端的pdf预览首先我们别像pc端一样&#…

接口自动化测试操作流程

接口自动化大致步骤&#xff1a; 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient&#xff0c;用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类&#xff0c;用于验证 4、自动生成报告的类&#xff1a;自…

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

1.0.0 IGP高级特性简要介绍(OSPF-下篇)

二、OSPF_精细的路由控制 1.OSPF数据库上限 简介 ​ OSPF技术要求同一个区域内的路由器保存着相同的LSDB信息。 ​ 但随着网络上路由数量不断增加&#xff0c;一些路由器由于系统资源有限&#xff0c;不能再承载如此多的路由信息&#xff0c;这种状态就被称为数据库超限&am…

‘XXX‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 系统找不到指定的路径。

目录 问题复现解决方案 问题复现 只要一打开cmd就提示“‘LT’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 或许大家都遇到过这样的问题&#xff0c;但本篇解决的是和运行项目无关&#xff0c;而是cmd命令行自带的一个bug 解决方案 如果是执行java…

vant+thinkphp实现文件上传功能

vantthinkphp实现文件上传功能 前端thinkphp后端测试 前端 vue3 vant 代码实现 fileList 预览文件列表&#xff0c;具体可以参考官方文档 let config { headers: { //添加请求头 “Content-Type”: “multipart/form-data”, }, }; 需要以form-data的形式上传文件&#xff…

IT服务台与Microsoft集成

Microsoft Teams 旨在通过创建一个共享工作区&#xff0c;使组织中的协作更加轻松&#xff0c;用户可以在其中聊天、开会、共享文件和访问业务应用。为了实现这些数字工作空间的最大效率&#xff0c;这一点很重要&#xff0c;当出现问题时&#xff0c;IT服务台团队始终在前沿。…

RDkit | 安装报错及使用

关于RDKit的学习及介绍&#xff1a; RDKit安装 基础教程&#xff1a;[Getting Started with RDKit in Python] RDkit四&#xff1a;数据处理过程中smiles编码的清洗统一化 reticulate-R Interface to Python 在RStudio中加载 rdkit.Chem和rdkit.Chem.rdmolops 时&#xff0c;报…

c语言实现两个有序链表的合并

合并两个有序链表是c语言数据结构中比较经典的问题&#xff0c;首先两个链表都是有序的&#xff0c;即节点的顺序是按照各个节点中的值从小到大排序&#xff0c;而且合并之后的新链表中的各个节点顺序也要满足从小到大的排序&#xff0c;具体如下图所示。 思路&#xff1a;用ma…

2012年7月11日 Go生态洞察:Gccgo在GCC 4.7.1中的集成

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mysql学习笔记--基础

一&#xff0c;SQL最重要的增删改命令格式 1&#xff0c;insert into 表名&#xff08;不写这个括号里面的内容就默认所有字段都要添加&#xff09; values&#xff08;&#xff09; 插入单条数据 2&#xff0c;insert into 表名 (里面是列名) values&#xff08;根据列名依次…

.Net-C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

阶段七-Day04-Spring03

一、Sping声明式事务 1. 编程式事务介绍 整个事务控制的代码都需要程序员自己编写。包含&#xff1a;开启事务&#xff08;openSession()&#xff0c;创建SqlSession时MyBatis底层自动创建Transaction对象&#xff09;、提交事务(session.commit())、回滚事务(session.rollba…

新型的铁塔基站“能源管家”

安科瑞 崔丽洁 引言&#xff1a;随着5G基站的迅猛发展&#xff0c;基站的能耗问题也越来越突出&#xff0c;高效可靠的基站配电系统方案&#xff0c;是提高基站能耗使用效率&#xff0c;实现基站节能降耗的重要保证&#xff0c;通过多回路仪表监测每个配电回路的用电负载情况&a…

Clickhouse学习笔记(9)—— 语法优化

ClickHouse 的 SQL 优化规则是基于 RBO(Rule Based Optimization&#xff09;实现的 官方数据集的使用 为了方便测试CK的语法优化规则&#xff0c;尝试使用官方提供的数据集&#xff1b; 需要使用的数据集是visits_v1和hints_v1&#xff1a; Anonymized Web Analytics Data …