Morris遍历
来源:互联网 发布:inapp软件 编辑:程序博客网 时间:2024/06/06 02:08
Morris算法,该算法的时间复杂度也是O(N),但是空间复杂度却能达到最优的O(1)。下面根据二叉树的三种遍历方式详细介绍Morris算法。
树的节点定义如下:
一、中序遍历:
算法步骤:
1. 如果当前节点的左子节点为空时,输出当前节点,并将当前节点置为该节点的右子节点;
2. 如果当前节点的左子节点不为空,找到当前节点左子树的最右节点(该节点为当前节点中序遍历的前驱节点);
2.1. 如果最右节点的右指针为空(right=null),将最右节点的右指针指向当前节点,当前节点置为其左子节点;
2.2. 如果最右节点的右指针不为空,将最右节点右指针重新置为空(恢复树的原状),输出当前节点,并将当前节点置为其右节点;
3. 重复1~2,直到当前节点为空。
下图显示了Morris算法中序遍历的过程。
Java实现如下:
二、前序遍历,前序遍历的基本思想和中序遍历很相似,只有输出顺序发生变化。
算法步骤:
1. 如果当前节点的左子节点为空时,输出当前节点,并将当前节点置为该节点的右子节点;
2. 如果当前节点的左子节点不为空,找到当前节点左子树的最右节点(该节点为当前节点中序遍历的前驱节点);
2.1. 如果最右节点的右指针为空(right=null),将最右节点的右指针指向当前节点,并输出当前节点(在此处输出),当前节点置为其左子节点;
2.2. 如果最右节点的右指针不为空,将最右节点右指针重新置为空(恢复树的原状),并将当前节点置为其右节点;
3. 重复1~2,直到当前节点为空。
下图显示了Morris算法前序遍历的过程:
Java实现如下:
三、后序遍历:后序遍历较前两者比较麻烦,需要建立一个临时节点,并令该节点的左子节点为root,并且需要一个子过程,倒序输出某两个节点之间路径上的各个节点。
算法步骤:
1. 如果当前节点的左子节点为空时,则将其右子节点作为当前节点;
2. 如果当前节点的左子节点不为空,找到当前节点左子树的最右节点(该节点为当前节点中序遍历的前驱节点);
2.1. 如果最右节点的右指针为空(right=null),将最右节点的右指针指向当前节点,当前节点置为其左子节点;
2.2. 如果最右节点的右指针不为空,将最右节点右指针重新置为空(恢复树的原状),倒序输出从当前节点的左子节点到该最右节点路径上的所有节点,并将当前节点置为其右节点;
3. 重复1~2,直到当前节点为空。
下图显示了Morris算法后序遍历过程(其中虚线框内的节点为临时节点):
Java实现如下:
- Morris遍历
- Morris遍历
- Morris遍历
- Morris遍历
- morris后续遍历
- Morris 树遍历算法
- Morris遍历二叉树
- Morris 先序遍历
- Morris 二叉树遍历
- Morris遍历二叉树
- morris 遍历二叉树
- Morris二叉树遍历算法
- Morris遍历二叉树算法
- Morris Traversal 遍历二叉树
- Morris二叉树遍历算法
- Morris二叉树遍历算法
- Morris二叉树遍历算法
- Morris二叉树遍历算法
- HDU 2052 JAVA
- caffe学习笔记2-caffe命令行训练与测试
- sdutacm-Sorting It All Out
- 【剑指offer】面试题17:合并两个排序的链表
- ARM流水线
- Morris遍历
- 网络爬虫之初识网络爬虫
- HDU 2053 JAVA
- eclipse安装spring插件
- 【Unity优化】Unity中究竟能不能使用foreach?
- sdutacm-小雷的冰茶几
- 前端各种页面跳转
- Android 蓝牙 BLE蓝牙 浅析
- Mysql_主从_配置详解