[leetcode]Binary Tree Postorder Traversal @ Python


原題地址: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
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM