图解二叉树的Morris(莫里斯)遍历

二叉树的Morris(莫里斯)遍历

本文参考链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/submissions/490846864/

文章目录

    • 二叉树的Morris(莫里斯)遍历
      • 模板代码
      • 前序遍历
      • 中序遍历
      • 后序遍历

Morris 遍历使用二叉树节点中大量指向 null 的指针,时间复杂度:O(n),额外空间复杂度:O(1)。

Morris 的整体思路就是将 以某个根结点开始,找到它左子树的最右侧节点之后与这个根结点进行连接。

在这里插入图片描述

我们可以从图中看到,连接之后,指针是可以完整的从根节点顺着下一个节点遍历,将整棵树遍历完毕,直到 7 这个节点右侧没有指向。

模板代码

首先介绍morris的模板代码,带*的注释表示该行为指定遍历所要增加的内容,可以先不管。

模板代码的流程图如下所示:

在这里插入图片描述

在这里插入图片描述

public List<Integer> traversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}//1.定义cur和prevTreeNode cur = root;TreeNode prev = null;//2.当cur不为空时while (cur != null) {//2.1prev为cur左子树prev = cur.left;//2.2prev不为空时if (prev != null) {//2.2.1用prev找到左子树最右侧节点while (prev.right != null && prev.right != cur) {prev = prev.right;}//2.2.2prev右子树不为空时,连接if (prev.right == null) {prev.right = cur;//*前+res.add(cur.val);cur = cur.left;} else { //2.2.3prev右子树不为空时,断开连接prev.right = null;//*中+res.add(cur.val); *后+print(cur.left)cur = cur.right;}} else { //2.3prev为空时//*前中+res.add(cur.val);cur = cur.right;}}//*后+print(root)return res;
}

前序遍历

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}//1.定义cur和prevTreeNode cur = root;TreeNode prev = null;//2.当cur不为空时while (cur != null) {//2.1prev为cur左子树prev = cur.left;//2.2prev不为空时if (prev != null) {//2.2.1用prev找到左子树最右侧节点while (prev.right != null && prev.right != cur) {prev = prev.right;}//2.2.2prev右子树不为空时,连接if (prev.right == null) {prev.right = cur;res.add(cur.val);cur = cur.left;} else { //2.2.3prev右子树不为空时,断开连接prev.right = null;cur = cur.right;}} else { //2.3prev为空时res.add(cur.val);cur = cur.right;}}return res;
}

中序遍历

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}//1.定义cur和prevTreeNode cur = root;TreeNode prev = null;//2.当cur不为空时while (cur != null) {//2.1prev为cur左子树prev = cur.left;//2.2prev不为空时if (prev != null) {//2.2.1用prev找到左子树最右侧节点while (prev.right != null && prev.right != cur) {prev = prev.right;}//2.2.2prev右子树不为空时,连接if (prev.right == null) {prev.right = cur;cur = cur.left;} else { //2.2.3prev右子树不为空时,断开连接prev.right = null;res.add(cur.val);cur = cur.right;}} else { //2.3prev为空时res.add(cur.val);cur = cur.right;}}return res;
}

后序遍历

当连接已完成时,断开连接后,打印下层的单链表,比如返回到2时,打印4,返回到1时,打印5,2,涉及到了逆序打印单链表的内容。注意应该是打印下一层,而不是当前层。循环结束后打印根节点所在的一侧,即7,3,1。

在这里插入图片描述

List<Integer> res = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {if (root == null) {return res;}//1.定义cur和prevTreeNode cur = root;TreeNode prev = null;//2.当cur不为空时while (cur != null) {//2.1prev为cur左子树prev = cur.left;//2.2prev不为空时if (prev != null) {//2.2.1用prev找到左子树最右侧节点while (prev.right != null && prev.right != cur) {prev = prev.right;}//2.2.2prev右子树不为空时,连接if (prev.right == null) {prev.right = cur;cur = cur.left;} else { //2.2.3prev右子树不为空时,断开连接prev.right = null;print(cur.left); //打印左子树cur = cur.right;}} else { //2.3prev为空时cur = cur.right;}}print(root); //打印根节点所在一侧return res;
}//打印链表
public void print(TreeNode head) {TreeNode revList = reverseList(head);TreeNode cur = revList;while (cur != null) {res.add(cur.val);cur = cur.right;}reverseList(revList);
}//翻转单链表
public TreeNode reverseList(TreeNode head) {TreeNode cur = head;TreeNode prev = null;while (cur != null) {TreeNode next = cur.right;cur.right = prev;prev = cur;cur = next;}return prev;
}

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

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

相关文章

瓜分340亿美元物联网芯片半导体市场!机会在这五大行业【附下载】| 智东西内参...

来源&#xff1a;智东西摘要&#xff1a;市场压力之下&#xff0c;物联网为工业、汽车、智慧城市、医疗健康和消费半导体提供了新的解决方案。半导体产业渗透了我们生活中的各个方面&#xff0c;从闹钟、微波炉到手机、笔记本。而现在&#xff0c;物联网技术正在为全球半导体市…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 11丨产品销售分析 II【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

用互联网大脑模型分析滴滴的战略意图和战术失误

作者&#xff1a;刘锋 互联网进化论作者&#xff0c;计算机博士滴滴出行与美国的Uber&#xff0c;本质上都是基于互联网的智能打车软件&#xff0c;让任何拥有家用汽车的司机都可以与出租车司机一样&#xff0c;服务于打车用户。 在滴滴&#xff0c;Uber出世之前的出租车行业…

仅需1/5成本:TPU是如何超越GPU,成为深度学习首选处理器的

作者&#xff1a;Kaz Sato 来源&#xff1a;Google Cloud、机器之心摘要&#xff1a;张量处理单元&#xff08;TPU&#xff09;是一种定制化的 ASIC 芯片&#xff0c;它由谷歌从头设计&#xff0c;并专门用于机器学习工作负载。TPU 为谷歌的主要产品提供了计算支持&#xff0c;…

[唐胡璐]Excel技巧 - 使用Excel 2007完成多人协同录入工作

下面我们来介绍下Excel 2007的共享功能。 一、设置共享 启动Excel 2007&#xff0c;打开需要设置共享的工作薄文档&#xff0c;切换到“审阅”菜单选项卡中&#xff0c;单击“更改”组中的“共享工作薄”按钮&#xff0c;打开“共享工作薄”对话框&#xff0c;如下图所示。 …

Android之jni入门

jni即java native interface&#xff0c;使用jni我们可以在JAVA中调用C代码&#xff0c;提高了效率&#xff0c;可以复用代码&#xff0c;可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译成so库 2.CygWin 在windows下模拟linux环境 3.CDT 在eclipse…

腾讯投资过 600 多家公司不惊奇,京东也有出手 260+ | 大公司投资并购盘点

来源&#xff1a;IT桔子A 股一片绿&#xff0c;这已经不是满屏绿色的第一天了&#xff0c;2018 年以来&#xff0c;A 股经历了起起落落落落落落……尤其在中美贸易战不断升级后&#xff0c;A 股的代表颜色就成了绿色&#xff0c;少数会有几家企业翻红&#xff0c;然而过不了几天…

埋点技术:“呵呵,你在网上的一举一动,都在我眼皮子底下”

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 1、什么是…

美国斯坦福大学发布2025计划, 创立开环大学, 彻底颠覆全球高等教育

来源&#xff1a;钱塘号《斯坦福大学2025计划》在以设计思考理论著称的斯坦福大学设计学院牵头下正式启动&#xff0c;这次教育改革改变了以往自上而下的方式&#xff0c;代之以师生为主导。与其说《斯坦福大学2025计划》是一个方案&#xff0c;不如说它是一个对未来大学模式进…

语言处理想突破,三座大山必须过

来源&#xff1a;大数据文摘编译&#xff1a;李佳、汤圆、钱天培“我的飞机什么时候到&#xff1f;”把这个问题抛给智能机器人助手。几乎可以肯定&#xff0c;机器立马就懵逼了。“我”是谁&#xff1f;“飞机”是航班还是淘宝上订的模型玩具呢&#xff1f;“到”又是到哪呢&a…

CSDN每日打卡已经2周,进展如何?(送两个CSDN背包)

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 点赞评论 …

趋势 | 人工智能领域十大最具成长性技术展望

来源&#xff1a;搜狐日前&#xff0c;在2018世界机器人大会基础技术与创新论坛中&#xff0c;中国电子学会发布了《新一代人工智能十大成长性技术展望》。经调研走访了一批在新一代人工智能技术及产业方面具备领先水平和特色的龙头企业&#xff0c;拜访了来自于知名高校、研究…

CTex + Texmaker

CTex 套装提供了一个Latex编译环境和相关的库&#xff0c;最大的优点是自动部署&#xff0c;直接就可以用。但是CTex自带的WinEdt和开源的Texmaker比起来在设计方面显得比较粗陋&#xff0c;影响工作效率。 Texmaker 本身只是一个前台软件&#xff0c;但是设计精良。如果已经安…

android之phonegap入门

利用phoneGap可以利用HTML开发安卓应用&#xff0c;是web app的一种&#xff0c;可以有效的提高开发效率&#xff0c;降低开发成本 。 第一步&#xff1a; 开发环境配置以及基本操作请参考其它文档. 新增一个名为 phoneGap 的android项目,将主activity命名为:PhoneGapActivi…

全球第二家 亚马逊“喜提”万亿美金市值 AI或是最大功臣

亚马逊创始人杰夫贝佐斯&#xff08;Jeff Bezos&#xff09;来源&#xff1a;网易智能摘要&#xff1a;9月5日消息&#xff0c;美国当地时间周二&#xff0c;全球电商巨头亚马逊(Amazon)股价一度触及史上最高点&#xff0c;促使亚马逊市值短暂达到1万亿美元。不过&#xff0c;在…

苹果/三星/华为纷纷布局人工智能 将AI作为公司发展新动力

来源&#xff1a;手机报在线摘要&#xff1a; 目前&#xff0c;以苹果、三星和华为为代表的手机厂商除了继续探索人脸识别、屏下指纹和柔性显示屏等技术外&#xff0c;也将目标瞄向了人工智能&#xff0c;纷纷将“AI拍照”、“AI芯片”等作为营销热门话题&#xff0c;并通过大力…

量子通信产业化初试,中国筹建千亿级国家实验室

来源&#xff1a;第一财经摘要&#xff1a;一个涉及多地的量子信息科学国家实验室&#xff08;下称“国家实验室”&#xff09;正在筹建&#xff0c;长期投资将达千亿元。第一财经从2018年国际量子密码会议上了解到&#xff0c;中国正在筹建的国家实验室涉及合肥、上海和北京等…

Android之自定义控件入门

本文主要讲述了实现安卓button点击变色与利用ViewPager实现图片自动轮播效果 我伞可以看到在很多应用中&#xff0c;安卓按钮按下时与正常时状态是不同的&#xff0c;这种效果也很容易达到。 第一步&#xff1a;创建XML文件定义不同事件的不同效果 <?xml version"1…

理性解读中国科技实力:不震惊式吹捧,也不全盘抹杀

来源&#xff1a;风云之声&#xff08;ID:fyvoice&#xff09;关于中国科技成果&#xff0c;大家一直都在讨论&#xff0c;网上也有很多评论文章。有的&#xff0c;把中国科技实力吹上天&#xff1b;有的&#xff0c;则干脆贬入地。中国在很多领域确实做得不错&#xff0c;与此…

Unity(四):使用场景Ⅰ:建立类型映射

在之前的一篇文章“Unity(三)&#xff1a;快速入门”中&#xff0c;给出了一个简单的示例&#xff0c;让我们对Unity有一个感性的认识。但是&#xff0c;Unity到底是做什么用的呢&#xff1f;一个简单示例并不能解答这个问题。 总的来看&#xff0c;Unity的使用场景主要有以下几…