鱼儿慢慢游~~

导航

 

题目描述:

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                  

 

posted on 2016-05-26 17:47  miss_UU  阅读(152)  评论(0编辑  收藏  举报