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]
.
Note: Recursive solution is trivial, could you do it iteratively?
树的后序遍历~同样,先是递归解法~代码如下~
class Solution:
# @param root, a tree node
# @return a list of integers
def postorderTraversal(self, root):
if root is None: return []
self.res = []
self.helper(root)
return self.res
def helper(self, root):
if root is None: return
self.helper(root.left)
self.helper(root.right)
self.res.append(root.val)
非递归解法如下~
1)如果当前栈顶元素的右结点存在并且还没访问过(也就是右结点不等于上一个访问结点),那么就把当前结点移到右结点继续循环;
2)如果栈顶元素右结点是空或者已经访问过,那么说明栈顶元素的左右子树都访问完毕,应该访问自己继续回溯了。
class Solution:
# @param root, a tree node
# @return a list of integers
def postorderTraversal(self, root):
if root is None: return []
res, stack, curr, prev = [], [], root, None
while stack or curr:
if curr:
stack.append(curr)
curr = curr.left
else:
parent = stack[-1]
if parent.right in (None, prev):
prev = stack.pop()
res.append(prev.val)
else:
curr = parent.right
return res
还有Morris遍历法,可以参考这篇博文 http://blog.csdn.net/linhuanmars/article/details/22009351