二叉树Morris遍历改写成后序遍历(java)

news2024/10/6 18:21:36

Morris 遍历

  • Morris 遍历改写成后序遍历
    • 解题思路
    • 代码演示
  • Morris 遍历

Morris 遍历改写成后序遍历

通过Morris遍历的顺序,将其调整为后序遍历的顺序,

解题思路

不明白morris 遍历,先查看上期
遍历二叉树的神级方法–Morris遍历

morris 遍历改写前序遍历和中序遍历都很简单,改写后序遍历是比较麻烦的,
1.需要在第二次到左树最后节点时,将当前节点的左树和左树的所有右子树,进行逆序输出,这里就需要指针的重连操作了,需要很细心,不要连错了,逆序输出后,还要将指针恢复,
2.在morris 遍历结束后,单独对头节点进行逆序其右节点。输出右节点的值。

示例:
在这里插入图片描述
后序遍历结果是:4 5 2 6 7 3 1.
在morris 遍历中,最开始节点在1节点,在遍历的过程中,节点不断向左子树移动,当第一次,节点的左子树的右节点不是null 时,cur 来到了2 节点,我们对2 节点的所有左子树和左子树的右节点进行逆序输出,
就先输出了4 :
再次回到1节点时,1节点的最右子节点5 的右子树不为null.将1节点的左子树和左子树上所有的右子树逆序输出,也就是2 -> 5 ,逆序,5 2 输出,

代码演示

 public static class Node{
        int val;
        Node left;
        Node right;

        public Node(int val) {
            this.val = val;
        }
    }

    /**
     * 后序遍历
     * @param root
     */
    public static void morrisPos(Node root){
        if (root == null){
            return;
        }
        //当前遍历到的节点
        Node cur = root;
        //当前节点的左树左右节点
        Node mostRight = null;
        while (cur != null){
            //先拿住当前节点的左子树
            mostRight = cur.left;
            //左子树不为null 时。进行左子树上的重连和找到最右节点的操作
            if (mostRight != null){
                //找到左子树的最右接点
                while (mostRight.right != null && mostRight.right != cur){
                    mostRight = mostRight.right;
                }
                //第一次来到最右节点时,进行下面操作
                if (mostRight.right == null){
                    mostRight.right = cur;
                    cur = cur.left;
                    continue;
                }else {
                    //第二次来到这个最右节点时,恢复指针。
                    mostRight.right = null;
                    printEdge(cur.left);
                }
            }
            //左子树为null 时,去右子树遍历
            cur = cur.right;
        }
        printEdge(root);
    }

    /**
     * 当前节点顺序先调成逆序,然后输出节点值
     * 最后再把顺序调整过来
     * @param root
     */
    public static void printEdge(Node root){
        Node tail = reverseEdge(root);
        Node cur = tail;
        while (cur != null){
            System.out.print(cur.val+ "  ");
            cur = cur.right;
        }
        reverseEdge(tail);
    }


    /**
     * 当前节点的后序节点进行逆序
     * @param root
     */
    public static Node reverseEdge(Node root){
        Node pre = null;
        Node next = null;
        while (root != null){
            next = root.right;
            root.right = pre;
            pre = root;
            root = next;
        }
        return pre;
    }

Morris 遍历

遍历二叉树的神级方法–Morris遍历

二叉树Morris遍历改写成前序遍历和中序遍历

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

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

相关文章

ros2 foxy robot-localization 里程计 imu多传感器融合踩坑指南

前言 Robot_localization是一个基于卡尔曼滤波 ROS的包,可以对里程计 imu gps多种传感器进行数据融合,进而完成机器人的定位的算法。对于不懂卡尔曼滤波的小伙伴,通过修改配置文件就能顺利的使用大佬们造好的轮子,极大的降低了使…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块7

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

Appium+python自动化(八)- 初识琵琶女Appium- 下(超详细)

​简介 通过上一篇给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉说:是,就对了。…

开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql

文章目录 问题描述我的使用场景描述结论本人其他相关文章链接 问题描述 开启慢SQL设置long_query_time0.1为啥会统计的sql却存在小于100毫秒的sql? 我的使用场景描述 我采用执行sql修改配置文件,也就是采用“临时生效操作步骤”开启慢SQL,比…

使用Mybatis-plus-join做多表查询

使用Mybatis-plus-join做多表查询 我们做多表查询都是要自己写sql的,还是比较麻烦的,下面介绍一种不用自己写sql的方式来完成多表查询。 这个第三方工具是一个大佬封装的一个jar包,即mybatis-plus-join架包,这个架包可以支持MyB…

实训平台场景一(培训)

过程:黑客通过内网攻击拿到了web服务器的权限,然后发现还有邮件服务器,通过双网卡一些漏洞攻击进来之后,业务双网卡通内网,通过他拿到了内网服务器。 #使用御剑目录扫描 现在流量传感器里面上传和流量表,…

python 抓取页面图片并保存到本地

1 直接上代码了 下面再做说明 今天就拿抓取这个页面的这块的图片为例 https://sc.chinaz.com/tupian/beijingtupian_2.html #分页下载所有的图片 完整例子 参考文档 https://blog.csdn.net/Monster_No17/article/details/106277822 import requests,lxml,re #发出…

Linux网络基础 — 网络层

目录 IP协议 IP协议报头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 补充 网络层 在复杂的环境中确定一个合适的路径。 IP协议 ip具有将数据从 主机A 跨网络送到 主机B 的能力。 主机: 配有IP地址,但是不进行路由控制的设备…

AI实时交互和实时动捕驱动数字人各有何优势?企业该怎么选择?

在元宇宙时代下 虚拟数字人作为虚拟偶像、虚拟代言人 数字员工、虚拟主播等身份 逐渐出现于大众视野 品牌通过虚拟数字人 实现跨领域、跨圈层营销 虚拟数字人 到底是什么? 是企业赋予品牌的一个可视化虚拟形象 是通过长时间的经营,可以形成品牌资…

6!Xshell全版本密码一键恢复工具

工具介绍 Xshell全版本凭证一键恢复工具,针对Xshell全版本在本地保存的密码进行解密,包括最新的7系列版本,可自动寻找或指定Sessions路径。 关注【Hack分享吧】公众号,回复关键字【230608】获取下载链接 .\SharpXDecrypt.exe .\S…

西安丨高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

目录 ​第一章 预测平台讲解及安装 第二章 一体化预测工具详解与数据获取及制备 第三章 风资源预测自动化技术 第四章 太阳能资源自动化预测技术 第五章 水资源自动化预测技术 第六章 后处理自动化技术 更多推荐 能源是国民经济发展和人民生活必须的重要物质基础。在过去…

怎样监控员工电脑在做什么?

随着科技的不断发展,越来越多的企业开始关注员工的工作效率和安全问题。为了确保员工的工作质量和保护企业的利益,监控员工的电脑屏幕成为一种常见的管理手段。 监控员工的电脑屏幕是一种现在大部分企业常见的管理手段,可以通过使用洞察眼MIT…

行业追踪,2023-07-17,静待减速器macd反转

自动复盘 2023-07-17 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

Ubuntu查找并安装指定版本包

命令如下: #查看指定包信息 apt-cache show kubeadm | grep 1.23.2 #安装指定版本 apt-get install kubeadm1.23.2-00

前端权限管理

一、概念 前端所谓的权限管理就是我们需要根据用户的角色不同来展示不同的内容,如下图所示: 超级管理员: vip会员: 游客: 像上面这样,根据用户的不同来展示不同的菜单栏。 二、实现思路 首先用户输入…

3GPP 中 规定V2X方案的性能要求

目录 1. 编队要求 2.高级驾驶性能要求 3.扩展传感器性能要求 4..远程驾驶性能要求 本文主要总结是将3GPP规定的V2X方案的性能要求,以做了解和参考。节选自5G核心网规划与应用 吴成林等编著,侵删。 1. 编队要求 (1)3GPP系统应…

【Linux】多线程(一)

文章目录 线程的概念线程优点线程缺点线程异常线程用途线程分离局部变量和全局变量互斥锁对锁的封装代码互斥量的接口互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况 常见的线程安全的情况常见不可重入的情况常见可重入的情况可重入与线程安全联系可重入与线程…

「流失订单召回」AI功能上线,助力企业高效挽回潜客!

据QuestMobile《2020年第三季度中国移动互联网行业数据监测报告》统计,国内用户将商品放入购物车但最终未购买的情况占比高达69.8%,这无异是品牌业务的重大损失点。 用户将商品加入购物车代表着他们有一定的购买意向,但是被“遗弃”也意味着…

Jenkins极简体验

做研发运营一体化(或者说运维)的人员,对Jenkins一定不陌生。 这个工具在CI/CD链条中充当了大内总管的角色 很多时候,我们喜欢用抽象的概念描述一个东西。本来简简单单的一个工具或者一个软件甚至一个系统,往往被冠以各…

【Vue】day01-Vue基础入门

目录 day01 一、为什么要学习Vue 二、什么是Vue 1.什么是构建用户界面 2.什么是渐进式 Vue的两种开发方式: 3.什么是框架 总结:什么是Vue? 三、创建Vue实例 四、插值表达式 {{}} 1.作用:利用表达式进行插值&#xff0c…