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

来源:互联网 发布:淘宝卖家如何分销 编辑:程序博客网 时间:2024/05/21 09:45

题目
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