leetcode 之Binary Tree Postorder Traversal

Posted 鱼儿慢慢游~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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                  

 

以上是关于leetcode 之Binary Tree Postorder Traversal的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 之Binary Tree Postorder Traversal(44)

Leetcode 之Binary Tree Preorder Traversal(42)

LeetCode之104. Maximum Depth of Binary Tree

Leetcode 之Binary Tree Postorder Traversal(43)

LeetCode题解之Diameter of Binary Tree

Leetcode 之Binary Tree Inorder Traversal(43)