Leetcode 145.二叉树的后序遍历(Binary Tree Postorder Traversal)

Leetcode 145.二叉树的后序遍历

1 题目描述(Leetcode题目链接

  给定一个二叉树,返回它的 后序 遍历。

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

2 题解

  二叉树的基本遍历方法之一。
递归方法:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        retv = []

        def posorder(root):
            if root:
                posorder(root.left)
                posorder(root.right)
                retv.append(root.val)
        posorder(root)
        return retv

迭代方法,需要借助栈的数据结构,类似前序与中序遍历,但是后序遍历需要多一个指针来记录上一个访问的节点,这样避免的是一个有右子树的节点被重复使用。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        retv = []
        stack = []
        pre = None
        while root or stack:
            while root:
                stack.append(root)
                root = root.left
            node = stack[-1]
            if not node.right or node.right == pre:
                retv.append(node.val)
                pre = node
                stack.pop()
                root = None
            else:
                root = node.right
        return retv

还有一种方法是按照前序的方法,不过遍历顺序是”根右左“,这样输出的时候将遍历结果倒过来输出就变成”左右根“的后序序列了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        retv = []
        stack = [root]
        while stack:
            root = stack.pop()
            if root.left:
                stack.append(root.left)
            if root.right:
                stack.append(root.right)
            retv.append(root.val)
        return retv[::-1]
发布了264 篇原创文章 · 获赞 63 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39378221/article/details/105045294