Python非递归实现二叉树的后续遍历

leetcode 145. Binary Tree Postorder Traversal

思路一:

  1. 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历;
  2. 如果根结点存在,结点入栈,并把结点的右子树遍历结果置为0,代表没遍历;
  3. 把root指向左子树;
  4. 如果栈不为空,判断栈顶元素右子树是否存在以及是否已经遍历,如果存在并且没有遍历,则把root指向右子树;否则,结点出栈,并且把结点的右子树遍历标志出栈;
  5. 重复2-4直到栈空或者root不存在。

    这是第一个一下想到的思路,可以看到用了两个栈作为额外的空间,复杂度不是很好,并且在leetcode上提交后,运行时间感觉也不甚理想,有没有更好的方法呢?
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        flag = []
        while root or stack:
            while root:
                stack.append(root)
                flag.append(0)
                root = root.left
            if stack:
                top = stack[-1]
                if top.right and not flag[-1]:
                    flag[-1] = 1
                    root = top.right
                else:
                    flag.pop()
                    ret.append(stack.pop().val)
        return ret

感觉在学校时接触的第一门语言是C,数据结构也是基于C学的,导致第一印象总是往上面靠,写出来的代码不是很Pythonic,下面是一个我觉得更好的,代码更少,也更容易理解的方法。

思路二:

后续遍历根结点,先遍历左子树,然后遍历右子树,此时反过来考虑:先遍历根结点,然后遍历右子树,最后是左子树,这样就可以转化为和先序遍历一个类型了,最后只把遍历结果逆序输出就ok了,而先序遍历是之前写过并且比较好理解的。

  1. 使用栈存储结点;
  2. 当结点存在或者栈不为空,判断结点;
  3. 当结点存在,结点值保存,结点入栈,并将指针指向结点的右子树;
  4. 当栈不为空,结点出栈,并将指针指向左子树;
  5. 重复2-4直到结果产生;
  6. 逆序输出结果,利用Python列表的-1.
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        while root or stack:
            while root:
                ret.append(root.val)
                stack.append(root)
                root = root.right
            if stack:
                top = stack.pop()
                root = top.left
        return ret[::-1]
原文地址:https://www.cnblogs.com/qiaojushuang/p/7887517.html