二叉树的inorder实现:递归、栈、Morris遍历

线索二叉树与Morris遍历 对于一棵普通的二叉树,它的节点结构需要由两个指针域和一个数据域构成。而一棵树中必定存在一些指针域没有被使用到,这就造成了空间的浪费。另一方面,我们经常用到二叉树的前、中、后序遍历,如果想求某种遍历中某个节点的前驱和后继节点,那就需要重新进行遍历。这无疑会造成时间的浪费。所以为什么不把空闲的指针域利用起来,让其指向节点的前驱或后继呢?其实这就是线索二叉树的核心思想。我们以中序遍历为例进行讲解。 阅读详情

不包含null值检查等robust代码。

递归:

inorderTreeWalk(TreeNode root) {
    if(root != null) {
        inorderTreeWalk(root.left);
        System.out.println(root.val);
        inorderTreeWalk(root.right);
    }
}

栈:

inorderTreeWalk(TreeNode root) {
    Stack<TreeNode> stack = new Stack<TreeNode>();
    while(root!=null || !stack.isEmpty()) {
        while(root != null) {
            stack.push(root);
            root = root.left;
        }
        System.out.println(stack.pop().val);
        root = root.right;
    }
}

Morris遍历:

TreeNode pre = null;
        while(root != null) {
            //如果root的左子树为空,直接访问该节点,然后访问右子树
            if(root.left == null) {
                System.out.println(root.val);
                root = root.right;
                continue;
            }
            //寻找root的前驱节点
            for(pre=root.left; pre.right != null && pre.right!=root; pre=pre.right);
            //如果是第一次访问pre,则建立thread(线索):将pre.right指向root
            if(pre.right == null) {
                pre.right = root;
                root = root.left;
            } else {    //第二次访问,说明左子树已经访问过了
                pre.right = null;
                System.out.println(root.val);
                root = root.right;
            }
        }
LeetCode094——二叉树的中序遍历 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/description/ 题目描述: 知识点:二叉树、中序遍历、递归 思路一:递归实现 学过数据结构的人都知道,二叉树天然的具有递归性质,因为二叉... 阅读详情

相关推荐

2023最新版kali安装教程

2023最新版kali安装教程 打开kali官网(https://www.kali.org/),下载kali镜像

qq_46346209的博客 2万+

树的前中后序的Morris遍历

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

qq_64580912的博客 2470

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 172

Morris 中序遍历

Morris 中序遍历是另一种遍历二叉树的方法,它能将非递归的中序遍历空间复杂度降为O(1)。 如果 x无左孩子,先将 xx 的值加入答案数组,再访问 xx 的右孩子,即 x = x.\textit{right}x=x.right。 如果 xx 有左孩子,则找到 xx 左子树上最右的节点(即左子树中序遍历的最后一个节点,xx 在中序遍历中的前驱节点),我们记为 predecessor。根据 predecessor 的右孩子是否为空,进行如下操作。 如果 predecessor 的右孩子为空,则将其右..

qq_35513792的博客 1078

做cellchat画图时自环的角度颠倒,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 464

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

(三十九)Flask 多应用架构(Multiple Apps)与 DispatcherMiddleware 实战解析

孤寒者的博客 1万+

【算法】学习笔记(三)----Morris前序遍历、中序遍历、后序遍历(C++代码)

Morris遍历,也称为莫里斯遍历,是一种使用线索二叉树实现的二叉树遍历方法,可以在不使用栈或递归的情况下完成对二叉树的遍历。Morris遍历方法的核心思想是利用每个节点中存储的指向父节点的指针,将左子树中最右侧节点的指向父节点的指针指向当前节点,以便在访问完当前节点的左子树后,能够通过这个指向父节点的指针回到当前节点。这样就。

weixin_50202509的博客 1425

【OpenClaw从入门到精通】第37篇:教育“龙虾”进化论——从答疑助教到全流程智能教学系统(2026实测版)

2026年,教育AI已从被动答疑的L1级进化至主动教学的L4级,清华开源的OpenMAIC平台更是打破传统慕课局限,实现互动式AI课堂。本文基于天津工业大学、西北农林科技大学等高校的真实应用案例,结合腾讯云、天翼云的实操指南,详解OpenClaw在教育场景的四层进化路径。核心内容包括:L1-L4级教育自动化架构解析、清华OpenMAIC L4级AI课堂深度拆解、从零搭建智能答疑(QQ群机器人)+作业批改+学情分析全流程系统,以及高校网络安全合规部署方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 789

Morris遍历——树的中序遍历

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

volcan的博客 708

基于STM32设计自动输液监测系统(241)

该系统集成了液位传感模块、光电传感器、电机模块、按键模块和OLED显示屏等多个功能模块,以实现全面的输液过程监控和控制。液位传感模块能够实时监测输液瓶中的液位,当液位到达限定值时,系统会自动控制步进电机夹紧输液管,并发出报警提醒,确保输液过程不会因液位过低而中断。

1343

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 280

莫里斯中序遍历(Morris Inorder Traversal)算法详细解读

莫里斯中序遍历(Morris Inorder Traversal)是一种在不使用递归或栈的情况下对二叉树进行中序遍历的方法。它的核心思想是利用二叉树中的空闲右子指针建立临时连接(即线索树),以便在回溯时找到前驱节点。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1791

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

递归和栈方法实现二叉树前后中序遍历及Morris遍历方法(java)

递归实现优点,简单,本质上也是用栈实现。 树结构定义: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } ...

weixin_44137260的博客 224

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

2. 二叉树的中序遍历 (inOrder)

头文件: 用到的是前序遍历中的头文件,具体可参见 "二叉树的前序遍历" 一,中序遍历的概念 中序遍历 按照 左儿子-根节点-右儿子 的顺序访问二叉树 方式 1,递归遍历 2,栈迭代遍历 (借助栈结构) 3, Morris 遍历 (栈迭代的基础上优化空间复杂度) 二,递归遍历 /* 递归遍历 先访问当前节点的左子树,然后再访问当前...

没戴面具的小丑 4567

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树的前、中、后遍历非递归实现

二叉树的前、中、后遍历非递归实现

底层码农 6221

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

二叉树中序遍历:从递归到迭代的C++实现与工程实践

二叉树遍历是数据结构与算法中的核心基础,它通过特定的节点访问顺序(如前序、中序、后序)来系统地处理树形结构。其原理在于深度优先搜索(DFS)思想,通过递归或使用栈来模拟递归过程,实现对每个节点的精确访问。掌握遍历算法具有重要的技术价值,它是理解更复杂树形算法(如二叉搜索树操作、树形DP)的基石,也是面试中考察候选人基本功的常见题型。在应用场景上,中序遍历尤为关键,它能将二叉搜索树(BST)的节点以升序输出,广泛应用于验证BST、查找第K小元素等问题。本文聚焦于二叉树的中序遍历,深入剖析其递归与非递归(迭代)

weixin_34288121的博客 407

二叉树遍历深度解析:从递归到迭代,掌握中序、先序、后序遍历

在数据结构与算法领域,树形结构是处理层次化数据的核心模型,而遍历则是访问和处理树中所有节点的基本操作。其原理在于,通过递归或迭代的方式,系统性地访问每个节点一次,访问顺序决定了遍历的类型。掌握遍历技术对于理解递归思想、优化程序性能至关重要,是解决文件系统操作、数据库索引(如B树)、表达式求值等工程问题的基石。本文聚焦于二叉树遍历,深入剖析中序、先序、后序三种深度优先遍历方式,通过手动模拟和代码示例,清晰阐释其递归本质与迭代实现,并探讨其在二叉搜索树排序、树结构复制等场景下的应用,帮助读者彻底理解并灵活运用这

weixin_30721077的博客 421

[LeetCode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历

给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法: 二叉树的中序遍历顺序为左-根-右,可以有递归和非递归来解,非递归解法又分为两种,一种是使用栈来接,另一种不需要使用栈的Morris方法。 Morris方...

Fabio的博客 477

94. Binary Tree Inorder Traversal

94. Binary Tree Inorder Traversal 1. 问题 Given a binary tree, return the inorder traversal of its nodes’ values. Example: Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2] Follow up: Recursive solution is trivial, could you do it iterativ

遇见你是我最美丽的意外 4281

遍历删除_Morris遍历

Morris遍历空间复杂度为O(1)的二叉树遍历算法通常我们对于二叉树进行遍历时,使用递归遍历或是基于栈来遍历,这两种方法都拥有最差为O(n)的空间复杂度(递归方法会在递归调用上浪费更多的时间),以及O(n)的时间复杂度。对于时间复杂度来说,由于需要遍历每个元素一次,所以O(n)已是最优情况。如此只能对空间进行优化。Morris遍历如何做到的呢?首先我们需要分析递归和基于栈的遍历它们为什么有O(n...

weixin_42517486的博客 113

Python二叉树遍历全解析:从递归到迭代,深度与广度优先的实现与应用

二叉树遍历是数据结构与算法中的核心基础,它不仅是访问树节点的规则,更是理解递归、栈、队列等关键编程概念的桥梁。从原理上看,遍历通过系统性地访问每个节点,实现对树形结构的完整探索,其技术价值在于为众多复杂问题提供了通用解决框架。深度优先遍历(DFS)利用栈(递归调用栈或显式栈)深入探索分支,包含先序、中序和后序三种变体,其中中序遍历对二叉搜索树(BST)至关重要,能直接输出有序序列。广度优先遍历(BFS)则使用队列按层访问节点,天然适合处理层次相关的问题,如寻找最短路径或层级统计。在实际应用场景中,遍历算法是

weixin_30682415的博客 290

二叉树中序遍历:原理、实现与应用场景

二叉树中序遍历(In-order Traversal)是数据结构中的基础算法,遵循'左子树→根节点→右子树'的访问顺序,特别适合需要有序输出的场景。其核心原理是利用递归或栈实现深度优先搜索,时间复杂度为O(n)。在工程实践中,中序遍历常用于二叉搜索树验证、文件系统索引等场景,能有效处理有序数据。递归实现简洁但可能栈溢出,迭代版本通过显式栈避免这一问题,而Morris遍历则以O(1)空间复杂度优化内存使用。掌握中序遍历不仅有助于算法面试,也是开发高效树形结构处理工具的关键技术。

weixin_33831673的博客 399

二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

关于二叉树的前序遍历(preoder)、中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是根左右,中序是左根右,后序是左右根。 python代码实现,先定义树节点的类如下: class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left

自动化研究生在读,此博客记录了我的学习与刷题经验,欢迎大家阅读交流 1796

二叉树算法实战:遍历与递归面试题精解

二叉树是数据结构与算法中的核心概念,其遍历方法(前序、中序、后序)通过递归或栈实现,层次遍历则需借助队列。理解这些基础原理对解决LeetCode高频面试题至关重要,如镜像对称判断、深度计算等。在实际工程中,二叉树算法常用于文件系统、数据库索引等场景。本文以LeetCode经典题目为例,详解递归与迭代的转换技巧,并分享层次遍历的变形应用,帮助开发者掌握二叉树问题的通用解法与优化策略。

weixin_34007020的博客 484
上一篇: Java:关于负数的向上转型
下一篇: 华为提前批机试题目
寂寞灵魂
博客等级 码龄15年 111粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值