zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    SQL Server 2012 联机丛书安装
    SQL Server 2012 联机丛书离线安装
    无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。
    System.Data.SqlClient.SqlError:无法对过程'XXX' 执行 删除,因为它正用于复制。消息 3724,级别 16
    在与SQL Server建立连接时出现于网络相关的或特定于实例的错误
    SQL Server如何删除多余tempDB文件
    无法用sysadmin权限的登录名登陆,sa密码忘了,管理员被锁在外面
    Linux----------nginx基础
    Linux----------varnish缓存加速
    Linux----------nginx日志分析
  • 原文地址:https://www.cnblogs.com/qiaojushuang/p/7887517.html
Copyright © 2011-2022 走看看