lintcode:二叉树的中序遍历 递归,迭代,Morris

题目
1.递归:

    def inorderTraversal(self, root):
        # 递归
        ret = []
        if not root:
            return ret
        self.inorderHelper(ret, root)
        return ret

    def inorderHelper(self, ret, root):
        if not root:
            return
        self.inorderHelper(ret, root.left)
        ret.append(root.val)
        self.inorderHelper(ret, root.right)

2 .迭代

    def inorderTraversal(self, root):
        #迭代
        res = [0]
        p = [root]
        while root or len(p) != 1:
            while root:
                p.append(root)
                root = root.left
            root = p[len(p) - 1]
            del p[len(p) - 1]
            res.append(root.val)
            root = root.right
        n = len(res)
        return res[1 : n]

3 . Moriis
这种方法不使用递归,不使用栈,O(1)的空间复杂度完成二叉树的遍历。这种方法的基本思路就是将所有右儿子为NULL的节点的右儿子指向后继节点(对于右儿子不为空的节点,右儿子就是接下来要访问的节点)。这样,对于任意一个节点,当访问完它后,它的右儿子已经指向了下一个该访问的节点。对于最右节点,不需要进行这样的操作。注意,这样的操作是在遍历的时候完成的,完成访问节点后会把树还原。整个循环的判断条件为当前节点是否为空。

详细参考资料:http://blog.csdn.net/u012877472/article/details/49401751

    def inorderTraversal(self, root):
        # Moriis 方法
        ret = []
        if not root:
           return ret
        curr = root
        while curr:
            if not curr.left:
                ret.append(curr.val)
                curr = curr.right
            else:
                pre = curr.left
                while pre.right and pre.right != curr:
                    pre = pre.right
                if not pre.right:
                    pre.right = curr
                    curr = curr.left
                else:
                    ret.append(curr.val)
                    pre.right = None
                    curr = curr.right
        return ret
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值