前置说明
不了解二叉树非递归遍历的可以看我之前的文章【数据结构与算法】二叉树模板及例题
Morris 遍历
概述
Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1) 。通过利用原树中大量空闲指针的方式,达到节省空间的目的
分析
设一棵二叉树有 n 个节点,则所有节点的指针域总和为 2 * n ,所有节点的非空指针域总和为 n - 1(非根节点被一个指针指向,根节点不被指针指向),所有节点的空指针域总和为 2n - (n - 1) = n + 1。
可以看到有大量的空指针域没有用到,在可以改变原二叉树结构的前提下,我们可以通过合理利用节点的空指针域,不开辟额外空间进行二叉树的非递归遍历。
❓ 那么先序、中序、后序遍历的节点访问顺序是如何确定的呢
如上图,根据紫色箭头顺序访问,第一次访问到的节点组成的集合就是先序遍历的结果。类似的,第二次访问到的节点组成的集合就是中序遍历的结果;第三次访问到的节点组成的集合就是后序遍历的结果。
通过设置节点访问不同次数的操作就可以实现三种遍历。
❓ Morris 遍历的实质:建立一种机制,对于没有左子树的节点只到达一次,对于有左子树的节点会到达两次
相关文章
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
- 遍历二叉树 - 基于递归的DFS(前序,中序,后序)
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
- 数据结构--二叉树的创建、先序遍历、中序遍历、后序遍历、深度、叶子结点数
- 二叉树的创建(先序)先序中序后序遍历(递归算法),求叶子结点个数,求树的高度,树中结点的个数,值为data的结点所在的层数
- 数据结构(一)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的前序,中序,后序遍历 的直观解释
- 数据结构----完全二叉树和满二叉树以及前序、中序、后序遍历
- 数据结构与算法__07--前序、中序、后序线索化二叉树,前序、中序、后序线索化二叉树遍历(Java语言版本)
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历