二叉树的Morris遍历

news/2024/11/28 21:01:03/

        Morris 遍历的是指就是避免用栈结构,而是让下层到上层有指针,具体时通过让底层节点指向 null 的空闲指针指回上层的某个节点,从而完成下层到上层的移动。

Morris 遍历的过程:

假设当前节点为cur,初始时cur就是整棵树的头节点,根据以下标准让cur移动:

1. 如果 cur 为 null,则过程停止,否则继续下面的过程。

2. 如果 cur 没有左子树,则让cur向右移动,即令 cur = cur.right。

3. 如果 cur 有左子树,则找到cur左子树上最右的节点,记为 mostRight。

1)如果 mostRight 的right指针指向null,则令 mostRight.right = cur,也就是让mostRight 的right指针指向当前节点,然后让cur向左移动,即令 cur = cur.left。

2)如果 mostRight 的right指针指向cur,则令 mostRight.right = null,也就是让 mostRight的right指针指向null,然后让cur向右移动,即令cur = cur.right。

举例:

 

 

 Morris 序代码实现:

    public static void morris(Node head) {if (head == null) {return;}Node cur = head;Node mostRight = null;while (cur != null) {mostRight = cur.left;//如果当前cur有左子树if (mostRight != null) {//找到左子树上最右的节点while (mostRight.right != null && mostRight.right != cur) {mostRight = mostRight.right;}//上面的while结束后,mostRight就是最右的节点if (mostRight.right == null) {mostRight.right = cur;cur = cur.left;continue;//回到最外层的while,继续判断cur的情况} else {//如果mostRight指向cur 让其指回nullmostRight.right = null;}} //cur如果没有左子树,cur向右移动//或者cur左子树的最右节点的右指针是指向cur的,cur向右移动cur = cur.right;}}

根据 Morris 遍历,加工出先序遍历:

1. 对于cur只能到达一次的节点(无左子树的节点),cur到达时直接打印

2. 对于cur可以到达两次的节点(有左子树的节点),cur第一次到达时打印,第二次到达时不打印。

先序遍历:

    public static 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节点while (mostRight.right != null && mostRight.right != cur) {mostRight = mostRight.right;}//当mostRight 为空时,说明第一次到达这个节点 直接打印。if (mostRight.right == null) {mostRight.right = cur;System.out.print(cur.value + " ");cur = cur.left;continue;//这里说明第二次到达这个节点 在先序中不在此处打印} else {mostRight.right = null;}//这里就是没有左子树的情况 直接打印} else {System.out.print(cur.value + " ");}cur = cur.right;}}

根据 Morris 遍历,加工出中序遍历:

1. 对于cur只能到达一次的节点(无左子树的节点),cur到达时直接打印

2. 对于cur可以到达两次的节点(有左子树的节点),cur第一次到达时不打印,第二次到达时打印。

中序遍历: 

    public static 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节点while (mostRight.right != null && mostRight.right != cur) {mostRight = mostRight.right;}//当mostRight 为空时,说明第一次到达这个节点 中序中不打印。if (mostRight.right == null) {mostRight.right = cur;cur = cur.left;continue;//这里说明第二次到达这个节点 在中序中此处需要打印} else {System.out.print(cur.value + " ");mostRight.right = null;}//这里就是没有左子树的情况 直接打印} else {System.out.print(cur.value + " ");}cur = cur.right;}}

测试结果:

        Node head = new Node(1);Node node1 = new Node(2);Node node2 = new Node(3);Node node3 = new Node(4);Node node4 = new Node(5);Node node5 = new Node(6);head.left = node1;head.right = node2;node1.left = node3;node1.right = node4;node2.right = node5;morrisPre(head);System.out.println();morrisIn(head);


http://www.ppmy.cn/news/9048.html

相关文章

异步通信技术AJAX | AJAX实现省市联动、AJAX跨域问题

目录 一:异步通信技术AJAX | 快速搞定AJAX(第四篇) 1、AJAX实现省市联动 2、超链接、form表单和JS代码跨域 3、AJAX跨域问题 (1)测试Ajax跨域访问 (2)同源 & 不同源 (3&a…

【Docker】三 镜像容器常用命令

这里写目录标题1 配置镜像加速器2 Docker镜像常用命令2.1 搜索镜像2.2 下载镜像[重要]2.3 列出镜像[重要]2.3 删除本地镜像[重要]2.4 保存镜像2.5 加载镜像2.6 构建镜像[重要]3 容器常用命令3.1 新建并启动容器[重要]3.2 列出容器[重要]3.3 停止容器[重要]3.4 强制停止容器[重要…

南大通用数据库-Gbase-8a-学习-31-VC间镜像同步

一、环境 名称值cpuIntel Core™ i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2VC1192.168.142.10VC2192.168.142.11 二、库级镜像同步 用途:使不同VC间的两个数据库进行实时同步。 (1)不同VC下的需…

sklearn预测评估指标计算详解:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1score

目录 前言 一、准确率 二、精确率 三、召回率 四、F1-score 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多&#xff0…

Linux进程间通信---->共享内存

文章目录什么是共享内存共享内存基本原理和共享内存有关的系统接口ftokshmgetipc相关命令查看相关共享内存信息删除相关共享内存信息shmat/shmdtshmctlipc系列设计思想总结什么是共享内存 前面我们学习了管进程间通信的一种方式—>管道。 而我们今天将要介绍的共享内存也是…

电路方案分析(十四)汽车电动座椅参考方案设计(H桥,高低边驱动器设计)

汽车电动座椅参考方案设计 tips:TI设计方案参考分析:TI Designs:TIDA-020008 双向和单向电机驱动器的电机驱动应用(如汽车电动座椅)的驱动和控制电路。它演示了如何驱动具有小电路板尺寸、高度可靠性和完整诊断功能的…

ArcGIS基础实验操作100例--实验40构建点对连线

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验40 构建点对连线 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

非Web服务弱口令检查工具下载与使用

今天继续给大家介绍渗透测试相关知识,本文主要内容是非Web服务弱口令检查工具下载与使用。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调&#xff1…