• leetcode 之Binary Tree Postorder Traversal


    题目描述:

    Given a binary tree, return the postorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3
    

    return [3,2,1]

    即 给定一颗二叉树。 使用后序遍历输出。 不用递归的方式。

    首先递归的方式:后续遍历的话先访问左子树,然后访问右子树,然后访问根节点。

     1 # Definition for a binary tree node.
     2 # class TreeNode(object):
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.left = None
     6 #         self.right = None
     7 
     8 class Solution(object):
     9     def postorderTraversal(self, root):
    10         """
    11         :type root: TreeNode
    12         :rtype: List[int]
    13         """
    14         res = []
    15         if not root:
    16             return res
    17         self.get(root, res)
    18         return res
    19         
    20     def get(self, root, res):
    21         if root.left:
    22             self.get(root.left, res)
    23         if root.right:
    24             self.get(root.right, res)
    25         res.append(root.val)       
    26                  

    非递归的思想是,需要向左找到叶子节点,并将节点依次放入栈中,并标记这些节点的左子树已经被访问了一次了。然后判断叶子节点的右子树是否存在,如果叶子节点右子树存在,继续向左找到叶子节点。。。并标记该节点的右子树已经访问过了。

    代码如下:

     1 # Definition for a binary tree node.
     2 # class TreeNode(object):
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.left = None
     6 #         self.right = None
     7 
     8 class Solution(object):
     9     def postorderTraversal(self, root):
    10         """
    11         :type root: TreeNode
    12         :rtype: List[int]
    13         """
    14         res = []
    15         tmp = []
    16         flag = []  // 右子树被访问标记
    17         flag1 = [] // 左子树被访问标记
    18         if not root:
    19             return res
    20         tmp.append(root)
    21         while tmp:
    22             while root.left and root not in flag1:
    23                 tmp.append(root.left)
    24                 flag1.append(root)
    25                 root = root.left
    26             node = tmp[-1]
    27             if  node not in flag:
    28                 if node.right:
    29                     tmp.append(node.right)
    30                     flag.append(node)
    31                     root = node.right
    32                     continue
    33                 else:
    34                     root = tmp.pop()
    35                     res.append(root.val)
    36             else:
    37                 root = tmp.pop()
    38                 res.append(root.val)
    39         return res
    40                  
    ~~~~~
  • 相关阅读:
    [linux]Linux下的log
    [WDT]内部看门狗和外部看门狗
    [misc]printf/fprintf/sprintf/snprintf函数
    [Linux]read/write和fread/fwrite有什么区别
    移动端图片操作(二)——预览、旋转、合成
    移动端图片操作(一)——上传
    实现tap的多种方式
    Hammer.js分析(四)——recognizer.js
    Hammer.js分析(三)——input.js
    Hammer.js分析(二)——manager.js
  • 原文地址:https://www.cnblogs.com/missmzt/p/5532067.html
Copyright © 2020-2023  润新知