莫瑞斯遍历

**文章目录
使用场景
算法流程
对比及本质
三种遍历

使用场景

**
遍历二叉树,要求时间复杂度O(n),空间复杂度O(1)。
【思路】
常规的栈结构遍历方式,遍历到某个节点之后并不能直接回到上层的结点,因此需要使用栈来完成回到上层结点的步骤。
Morris遍历避免了使用栈结构,让下层有指向上层的指针,但并不是所有的下层结点都有指向上层的指针([这些指针也称为空闲指针])。

**

算法流程

**
当前节点记为cur,如果cur无左孩子,则cur向右移动,cur=cur.right
如果cur有左孩子,则找到左子树上最右的节点,记为mostRight
1)如果mostright的右指针指向空,则让其指向cur,此时cur向左移动,cur = cur.left
2)如果mostright的右指针指向cur,则让其指向空,cur向右移动,cur=cur.right
在这里插入图片描述

左边是需要遍历的树,右边是这个方法遍历二叉树,curr节点所经过的位置。
如果一个节点有左子树,Morris遍历会到达它两次;如果没有左子树,只遍历一次。当第二次到达某一个节点时,它的左子树上的节点都已经遍历完了。所以总的时间复杂度去除常数,依旧为O(N)。

对比及本质
1.对于递归版本的二叉树:来到一个节点会遍历左子树和右子树,遍历完左子树之后,会重新回到当前节点,遍历完右子树之后,同样需要返回当前节点,所以总共遍历了当前节点三次。递归是利用行号,利用二叉树中的信息进行判断是第一次还是第二次第三次来到当前节点。
2.莫里斯遍历:如果这个树有左子树,则遍历这个节点两次,否则遍历这个节点1次。morris是利用左子树的最右孩子是否指向空,来进行判断是第一次来到这个节点还是第二次来到这个节点。(如果指向空则是第一次,如果指向自己,则第二次来到该节点)
一个节点在第一次来到此节点时访问其实就是先序遍历。

在这里插入图片描述
在这里插入图片描述
后序:只关注每个有第二次返回的节点
1.每当有一个第二次到达的节点,就逆序打印其左子树的右边界;
2. 整个树的二次返回节点的操作1打印完之后,逆序打印整棵树的右边界。
3. 通过将链表反转来逆序打印右边界,再次反转来恢复原二叉树。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值