一、Morris遍历
一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1)
通过利用原树中大量空闲指针的方式,达到节省空间的目的
二、Morris遍历细节
假设来到当前节点cur,开始时cur来到头节点位置
1)如果cur没有左孩子,cur向右移动(cur = cur.right)
2)如果cur有左孩子,找到左子树上最右的节点mostRight:
a.如果mostRight的右指针指向空,让其指向cur,
然后cur向左移动(cur = cur.left)
b.如果mostRight的右指针指向cur,让其指向null,
然后cur向右移动(cur = cur.right)
3)cur为空时遍历停止
三、Morris遍历实质
建立一种机制:
对于没有左子树的节点只到达一次,
对于有左子树的节点会到达两次
morris遍历时间复杂度依然是O(N)
四、代码演示
package class30;
/**Morris遍历
*
* 一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1)
*
* 通过利用原树中大量空闲指针的方式,达到节省空间的目的
*
* 假设来到当前节点cur,开始时cur来到头节点位置
* 1)如果cur没有左孩子,cur向右移动(cur = cur.right)
* 2)如果cur有左孩子,找到左子树上最右的节点mostRight:
* a.如果mostRight的右指针指向空,让其指向cur,
* 然后cur向左移动(cur = cur.left)
* b.如果mostRight的右指针指向cur,让其指向null,
* 然后cur向右移动(cur = cur.right)
* 3)cur为空时遍历停止
*
*
* Morris遍历实质
* 建立一种机制:
*
* 对于没有左子树的节点只到达一次,
*
* 对于有左子树的节点会到达两次
*
* morris遍历时间复杂度依然是O(N)
*/
public class MorrisTraversal {
//节点类
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int v) {
value = v;
}
}
public static void process(Node roo

文章详细介绍了Morris遍历这种二叉树遍历方法,其特点是时间复杂度为O(N),空间复杂度为O(1)。通过对二叉树节点的处理,实现了在遍历过程中不使用额外数据结构。此外,文章提供了Morris遍历的先序、中序、后序遍历实现,并展示了如何用Morris遍历求解二叉树的最小深度问题。
最低0.47元/天 解锁文章
1158

被折叠的 条评论
为什么被折叠?



