morris 二叉树遍历

def MorrisTraversal(root):
    pre = None
    if root is None:
        return
    curr = root
    while curr is not None:
        if curr.left is None:
            print curr.val
            curr = curr.right
        else:
            pre = curr.left
            while pre.right is not None and pre.right != curr:
                pre = pre.right
            if pre.right is None:
                pre.right = curr
                curr = curr.left
            elif pre.right == curr:
                pre.right = None
                print curr.val
                curr = curr.right

莫里斯遍历的大意:先定义一个当前节点,并将其指向根节点。然后定义一个所谓“前节点”,先不赋值。

1.如果当前节点没有左子树:

  • a.打印它的值(访问它)
  • b.将其移动到它的右子节点。

2.否则:

  • a.将前节点指向到当前节点(根节点)的左子节点。
  • b.前节点从这里开始,一直往右节点走,直到走到最右边的子节点。
  • c.将前节点的右子节点(本来为空)指向当前节点。

Morris Traversal的时间复杂度是O(N),空间复杂度是常数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值