原題地址:http://oj.leetcode.com/problems/binary-tree-postorder-traversal/
題意:實現后序遍歷。遞歸實現比較簡單,非遞歸實現。
解題思路:這道題的迭代求解比先序遍歷和后序遍歷要麻煩一些。假設一棵樹是這樣的:
1
/ \
2 3
/ \
4 5
使用一個棧。分幾個步驟:
一,將根節點入棧,並將根節點的孩子入棧,入棧順序為:先入右孩子,再入左孩子,順序不能錯。因為這樣在彈棧時的順序就是后序遍歷的順序了。如果左孩子還有左孩子或者右孩子,那么繼續按先右后左的順序入棧。那么上面這棵樹開始的入棧順序是:1,3,2。由於2不存在左右孩子,停止入棧。
二,由於2沒有左右孩子,遍歷2並將2彈出,同時使用prev記錄下2這個節點。
三,2出棧后,棧為{1,3},此時3在棧頂,由於3存在左右孩子,按順序入棧,此時棧為{1,3,5,4}。
四,將4和5遍歷並出棧,此時prev指向5,棧為{1,3}。prev的作用是什么呢?用來判斷prev是否為棧頂元素的孩子,如果是,則說明子樹的孩子已經遍歷完成,需要遍歷樹根了。以上樹為例:4和5出棧后,prev指向5,而5是棧頂元素3的孩子,說明孩子已經遍歷完畢,則遍歷3然后彈出3即可,即完成了子樹{3,4,5}的后序遍歷。
五,此時棧為{1},為樹根,而左右子樹都遍歷完了,最后遍歷樹根並彈出即可。
代碼:
# Definition for a binary tree node # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # @param root, a tree node # @return a list of integers def recursive_postorder(self, root, list): if root: self.postorder( root.left, list ) self.postorder( root.right, list ) list.append(root.val) def iterative_postorder(self, root, list): stack = [] pre = None if root: stack.append(root) while stack: curr = stack[len(stack) - 1] if (curr.left == None and curr.right == None) or (pre and (pre == curr.left or pre == curr.right)): list.append(curr.val) stack.pop() pre = curr else: if curr.right: stack.append(curr.right) if curr.left: stack.append(curr.left) return list def postorderTraversal(self, root): list = [] self.iterative_postorder(root,list) return list