题目描述:
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
时间: 2024-10-06 09:31:45