zoukankan      html  css  js  c++  java
  • 每日leetcode-数组-145. 二叉树的后序遍历

    分类:二叉树-二叉树的遍历

    题目描述:给定一个二叉树,返回它的 后序 遍历。

    解题思路:

    递归:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            递归
            def postorder(root:TreeNode):
                if not root:
                    return []
                postorder(root.left)
                postorder(root.right)
                res.append(root.val)
            res = []
            postorder(root)
            return res

    迭代:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
           # 迭代
            if not root:
                return []
            res,stack = [],[root]
            prev = root # 为了判断父子节点关系
            while len(stack):
                root = stack.pop()# 取出一个节点,表示开始访问以该节点为根的子树
                if (not root.right and not root.left ) or ( root.right ==prev or root.left == prev): 
                    # 如果该节点为叶子节点,或者已经访问该节点的子节点
                    res.append(root.val) # 直接访问
                    prev = root
                else:# 否则就顺序把当前节点,右孩子,左孩子入栈
                    stack.append(root)
                    if root.right:
                        stack.append(root.right)
                    if root.left:
                        stack.append(root.left)
            return res
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def postorderTraversal(self, root: TreeNode) -> List[int]:
            if not root:
                return []
            res,stack=[],[]
            prev = None
            while root or stack:
                while root:
                    stack.append(root)
                    root = root.left
                root = stack.pop()
                # 比前序和中序的模板增加一个判断过程:节点没有右孩子或已经访问了该节点的子节点
                if not root.right or root.right == prev:
                    res.append(root.val)
                    prev = root
                    root = None 
                else:
                    stack.append(root)
                    root = root.right
            return res
  • 相关阅读:
    [转]实习生需要懂的40大基本规矩
    [转]Linux下pppoe配合Drcom插件上网方法介绍......
    收藏一些图书
    [转]30个自我提升技巧
    [转]关于Gmail打不开的解决办法
    [转]李开复经典语录盘点:人生之路在于每次的选择
    [转]哈佛管理世界中智慧
    胡伟武校友在2011年中国科大本科生毕业典礼暨学位授予仪式上的讲话
    Dynamics4.0和Dynamics2011处理Email的方法
    JS实现简单的ToolTip功能
  • 原文地址:https://www.cnblogs.com/LLLLgR/p/14978787.html
Copyright © 2011-2022 走看看