morris遍历树

morris遍历详解(实现树的前中后序遍历) morris遍历详解(实现树的前中后序遍历) morris遍历介绍 morris遍历是二叉树遍历算法的至强算法,不同于递归,非递归(栈实现)的空间复杂度,morris遍历可以将非递归遍历中的树的深度的空间开销,降为O(1)。从而实现时间复杂度为O(n),而空间复杂度为O(1)的精妙算法。 morris遍历利用的是树的叶节点左右孩子为空,这一特性来实现空间开销的极度缩减。 morris遍历的... 阅读详情
    public class Node{
        Node left;
        Node right;
        int val;
    }
    public void morris(Node head){
        if(head == null){ return;}
        Node cur = head;
        Node mostRight = null;
        while(cur != null){
            mostRight = cur.left;
            if(mostRight != null){
                //如果当前cur有左子树,找到cur左子树上最右的节点
                while(mostRight.right != null && mostRight.right != cur){
                    mostRight = mostRight.right;
                }
                if(mostRight.right == null){
                    //如果right为null,则指向cur.
                    mostRight.right = cur;
                    //cur向左移动
                    cur = cur.left;
                    continue;
                    //继续判断cur
                }else{
                    mostRight.right = null;
                }
            }
            //cur没有左子树cur向右移动,或者cur左子树上最右节点已经指向了cur,cur向右移动。
            cur = cur.right;
        }
    }

    //先序遍历对于cur只能到达一次的节点(无左子树的节点),cur到达时直接打印。
    //对于cur可以到达两次的节点(有左子树的节点),cur第一次到达时打印,第二次到达时不打印。
    public void morrisPre(Node head){
        if(head == null){
            return;
        }
        Node cur = head;
        Node mostRight = null;
        while(cur != null){
            mostRight = cur.left;
            if(mostRight != null){
                while(mostRight.right != null && mostRight.right != cur){
                    mostRight = mostRight.right;
                }
                if(mostRight.right == null){
                    mostRight.right = cur;
                    System.out.println(cur.val);
                    cur = cur .left;
                    continue;
                }else{
                    mostRight.right = null;
                }
            }else{
                System.out.println(cur.val);
            }
            cur = cur.right;
        }
    }
    //中序遍历对于cur只能到达一次的节点,直接打印。
    //对于cur可以到达两次的节点,cur第一次到达时不打印,第二次到达时打印
    public void morrisIn(Node head){
        if(head == null){ return;}
        Node cur = head;
        Node mostRight = null;
        while(cur != null){
            mostRight = cur.left;
            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;
                }
            }
            System.out.println(cur.val);
            cur = cur.right;
        }
    }
    //后续遍历
    //1.对于cur只能到达一次的节点直接跳过。
    //2.对于cur可以到达两次的任何一个节点X,cur第一次到达X时没有打印行为,当第二次到达X的时候,逆序打印X左子树的有边界.
    //3.cur遍历完成后,逆序打印整棵树的有边界
    public static void printEdge(Node head){
        Node tail = reverseEdge(head);
        Node cur = tail;
        while(cur != null){
            System.out.println(cur.val+ " ");
            cur = cur.right;
        }
        reverseEdge(tail);
    }
    public static Node reverseEdge(Node from){
        Node pre = null;
        Node next = null;
        while(from != null){
            next = from.right;
            from.right = pre;
            pre = from;
            from = next;
        }
        return pre;
    }
    public void mirrisPos(Node head){
        if(head == null){
            return;
        }
        Node cur = head;
        Node mostRight = cur.left;
        while(cur!=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);
                }
            }
            cur = cur.right;
        }
        printEdge(head);
    }

 

【异常】Cursor 编辑器 “Too many computers“ 报错排查与完整解决方案 该报错通常在启动Cursor、调用AI对话/代码补全核心功能时触发,会直接阻断编辑器AI能力的正常使用。 阅读详情

相关推荐

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 405

树的前中后序的Morris遍历

Morris遍历是一种用于二叉树遍历的算法,它可以在不使用栈或队列的情况下实现中序遍历。该算法的时间复杂度为O(n)空间复杂度为O(1)。前序和中序的遍历很想,只不过在打印(收集结点信息的时候不同),中序遍历是在当前结点的左节点为空(curr.left==null),或者当前结点已经被线索化(prev.right==curr)的时候进行打印,仔细观察前序遍历的过程,我们通过修改打印的顺序即可.前序遍历是在当前结点的左节点为空(curr.left==null),或者当前结点没有被线索化(prev.right=

qq_64580912的博客 2470

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

算法与数据结构——Morris遍历(java)(b站左程云课程总结)

算法与数据结构——Morris遍历(java)

Borslav的博客 536

2025_NIPS_Better Tokens for Better 3D: Advancing Vision-Language Modeling in 3D Medical Imaging

近年来,3D医学成像领域的视觉语言建模取得了显著进展,这得益于大规模带配对自由文本报告的计算机断层扫描(CT)语料库、更强大的架构以及高性能预训练模型。这些进展推动了自动报告生成和文本条件3D图像合成等应用的发展。然而,现有方法在处理高分辨率、长序列体积数据时仍面临挑战:对比预训练往往导致视觉编码器与临床语言错位,而基于切片的令牌化会模糊精细解剖结构,降低下游任务的诊断性能。

c_cpp_csharp的专栏 90

基于STM32设计的智能水产养殖系统(2025)_359

本设计提出并实现了一种基于STM32F103RCT6微控制器的智能水产养殖控制系统,针对传统水产养殖中人工依赖高、环境参数监测滞后、控制手段单一等问题,集成了TDS水质检测、水温检测、水位监测、自动喂食、自动充氧、换水控制与加热保温等功能。系统采用ESP8266模块实现WIFI联网,通过MQTT协议将关键数据上传至华为云物联网平台,支持Android手机APP和Windows上位机远程监测与控制。同时,系统具备本地LCD数据显示与蜂鸣器异常报警功能,支持本地按键控制操作。整套系统功能完善,响应灵敏,运行稳定

624

【数据结构与算法-Java】二叉树的Morris遍历

二叉树的遍历可以选择 递归 或者 自己创建栈空间做 时间复杂度O(N),空间复杂度O(H) 而Morris遍历可以实现空间复杂度O(1) 01 Morris遍历的过程 首先,令current = head (1)当cuurrent没有左子树,current向右(current = current.right) (2)当cuurrent有左子树,找左子树最右mostRight (2.1) 当MostRight的右指针为空(MostRight.right == null), 则该右指针指向cur..

gyxx1998的博客 924

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

整理:Java二叉树遍历(递归、迭代、Morris)原创图解+代码

刷题的时候看到一些二叉树遍历的解法,整理在这里作为笔记,也分享给大家。语言是 Java 的,我会采取代码+图解+说明形式来尽可能讲明白每种遍历方式。

qq_64257622的博客 2141

基于 Qt 的轻量化工业组态软件设计与实现

本文设计并实现了一种基于Qt框架的轻量化工业组态软件,解决了传统组态软件体积庞大、部署复杂等问题。该软件采用模块化架构,集成可视化图形编辑、设备数据采集、脚本扩展等核心功能,具有跨平台运行、资源占用低、启动速度快等特点。通过关键技术优化,实现了高效稳定的数据采集、脚本控制和网络通信,可广泛应用于工业机器人HMI、小型PLC监控等轻量化场景。测试结果表明,该软件体积约30MB,运行内存占用60-80MB,启动时间1.2秒,满足工业轻量化监控需求。未来可扩展更多工业组件和协议支持,进一步提升应用价值。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 140

迅投miniQMT量化交易实战指南:从入门到自动化交易系统构建

迅投miniQMT量化交易实战指南摘要 本文全面介绍迅投miniQMT量化交易系统的开发流程,重点包括: 环境配置:详细说明miniQMT极简模式的安装步骤,包括xtquant库获取、Python版本要求及验证方法 行情数据模块:解析xtdata模块的核心功能,包括: 获取板块分类与股票列表 查询合约基础信息 下载历史K线数据(支持tick、分钟、日线等周期) 交易执行模块:介绍xttrader模块的交易API,涵盖: 账户连接与初始化 订单管理(下单、撤单、查询) 持仓与资产查询 实战开发:提供可直接运行

huanghm88的专栏 665

Morris遍历

Morris遍历 一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1)。通过利用原树中大量空闲指针的方式,达到节省空间的目的。 Morris遍历的关键 利用一棵树上大量的右指针空闲空间 Morris遍历细节 假设来到当前节点cur,开始时cur来到头节点位置 如果cur没有左孩子,cur向右移动(cur = cur.right) 如果cur有左孩子,找到左子树上最右的节点mostRight : a. 如果mostRight的右指针指向空,让其指向cur,然后cur向左移动(cur =

Harrison的学习博客 3949

SAE ARP 4761A内容详解

SAE ARP 4761A主要为民用航空系统及设备的安全评估提供指南,帮助制造商和设计者满足FAA的FAR 25.1309等适航标准的要求。该文档旨在为航空器和航空系统设计中涉及的安全评估流程提供一个结构化的框架,并结合一系列工具和方法,如故障树分析(FTA)、依赖图分析(DD)、马尔可夫分析(MA)等,来系统地评估潜在的安全隐患。这一标准不仅适用于大型航空器的设计和评估,还可以应用于各种类型的飞行系统,如无人驾驶飞行器(UAV)和新型的电动垂直起降飞机(eVTOL)。

qq_41854911的博客 3147

Java常见算法(五)【二叉树:morris遍历】

文章目录二叉树遍历-线索二叉树(Morris)1、前序遍历-线索二叉树2、中序遍历-线索二叉树(常用)3、后序遍历-线索二叉树(不推荐)实验源码: 二叉树遍历-线索二叉树(Morris) https://www.bilibili.com/video/BV1Jv411A7Ty?p=31 1、前序遍历-线索二叉树 https://www.bilibili.com/video/BV1Jv411A7Ty?p=32 //1、前序-线索二叉树:根 左 右 public static void morr

会飞的小蜗 775

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Morris遍历——树的中序遍历

Morris 遍历是一种在二叉树中进行中序(或前序)遍历的算法,其主要优点是能够在不使用递归或栈的情况下,使用常数额外空间(O1空间复杂度)完成遍历,通过临时修改树的指针来实现。

volcan的博客 708

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Morris遍历算法 树的中序遍历

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

LiXenon的博客 510

如何在Java中实现高效的树遍历算法:从Morris遍历到层次遍历

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!树遍历算法在计算机科学中扮演着重要角色,尤其在处理数据结构和算法时。树遍历主要分为深度优先遍历和广度优先遍历。不同的遍历方式适用于不同的场景,每种方式都有其优缺点。本文将探讨几种高效的树遍历算法,包括Morris遍历、前序遍历、中序遍历、后序遍历以及层次遍历,并提供相应的Java代码实现。

微赚淘客系统开发者博客 530

树的三种基本遍历+层序遍历+神级遍历(Morris)

树的遍历的方式有很多 今天在这里进行一个汇总 不多说 直接上干货 三种基本遍历分别用递归和非递归来实现 所以需要用到stack 层序遍历需要用到queue 所以先引入头文件 #include<iostream> #include<stack> #include<queue> using namespace std; 先建立一个树的结点 class B...

zxx2096的博客 1353

【树】Morris中序遍历

左树全入栈-》弹出栈顶-》打印-》开始讲右树的左树全入栈。

2202_75999061的博客 383

Morris遍历-空间复杂度o(1)遍历树

文章目录彩蛋题Morris遍历它的意义步骤(对于当前节点cur,可以结合eg理解)eg(利用底层空闲指针回到上层)时间复杂度O(N)的证明morris代码MORRIS转成先序MORRIS转成中序MORRIS转成后序逆序输出右边界时如何保持空间复杂度为O(1)?后序morris代码 彩蛋题 奇数放奇数,偶数放偶数 双指针 设置奇数不对位置指针,设置偶数不对位置指针,两个指针都隔着格子来跳即可。 Morris遍历 它的意义 它可以实现非递归算法,以O(1)的空间复杂度来实现遍历树 morris遍历就即先走

hch977的博客 514

树(一)——Morris 二叉树神级遍历

前言 二叉树的遍历是解决二叉树相关问题难以回避的问题,很多问题都是在遍历的基础上来解决的。根据问题的不同,我们可以采用不同的遍历方式。 按照对根节点操作的顺序可以分成: 先序遍历 中序遍历 后序遍历 层次遍历 按照实现遍历的方式可以分成: 递归:代码简单,易于理解,但是浪费JVM栈内存。 迭代:利用辅助结构,实现遍历,需要设计遍历的顺序。 迭代的方式遍历数组的时间复杂度为O(n),空间复杂度为O(h)。h为树的高度。Mirrors遍历的优势在于,不采用辅助结构遍历二叉树,其空间复杂度为O(1)。 为

yindarui 2011

Morris遍历树-----Morris前中后序遍历

Morris遍历树-----Morris前中后序遍历

m0_57802508的博客 717

Morris 遍历一颗树, 前序中序

理解 Morris 遍历的原理需要一些对二叉树的基本概念和指针操作的了解。让我们详细解释 Morris 前序遍历的原理。

m0_62856417的博客 198

树的 前驱遍历(Morris)

树的 前驱遍历(Morris)

qq_42352936的博客 447

c语言 树遍历算法,Morris 二叉树遍历算法(C语言描述)

对于二叉树的遍历,在数据结构中介绍有三种遍历方式:前序遍历,中序遍历和后序遍历. 这三种遍历方式通常采用递归或者迭代方式实现.递归实现或者迭代实现都是时间复杂度为O(n)的算法,并且在遍历过程中需要用到堆栈保存信息,它们的空间复杂度也都是O(n).下面要介绍的Morris二叉树遍历算法是时间复杂度为O(n),空间复杂度为O(1)的遍历算法,它也有前序遍历,中序遍历和后续遍历三种遍历顺序Morris...

weixin_39649405的博客 278

树的遍历方式(前中后,层序遍历,递归,迭代,Morris遍历)-----直接查询代码

在进行使用栈进行迭代的时候,我们是先入栈右节点,然后入栈左节点,这样做是和栈的结构进行匹配的,因为栈是先进后出的结构,所以先入栈右节点,再入栈左节点,这样出栈的时候左节点才能先出栈。第三次:出栈顶元素2,stack={3},入栈2的右节点,入栈2的左节点.stack={3,5,4}第四次:4结点出队列,4的左节点入队列,5结点出队列,5的右节点入队列,queue={6,7}第四次,出栈顶元素4,stack={3,5},入栈4的左节点6,stack={3,5,6};第一次:先入栈1,stack={1}

qq_64580912的博客 1383

Morris中序遍历解决LeetCode501

Morris中序遍历 由于在遍历的时候,我们需要记住某种遍历次序的的后驱或者前驱结点, 常见的递归和非递归都是采用栈的方式完成这个过程,有没有内部空间来记录这些后驱或者前驱结点呢? 有,那就是叶结点的左,右孩子结点,因为叶结点的两个孩子结点都是空指针, 如果利用好这些空间,我们就可以在O(1) 的空间完成遍历。 基本思想 Morris 中序遍历过程如下: 1.当前结点的左孩子是否为空,若是则输出当前结点,更当前结点为当前结点的右孩子;否则进入2; 2.在当前结点的左子树中寻找中序遍历下的前驱结点(左子

一个白馒头的博客 215
上一篇: Redis简介
下一篇: 回首2020,展望2021
Tate_Brown
博客等级 码龄9年 39粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值