leetcode 第144題 二叉樹的前序遍歷, 第94題二叉樹的中序遍歷, 第145題 二叉樹的後序遍歷

leetcode 第144題 二叉樹的前序遍歷, 第94題二叉樹的中序遍歷, 第145題 二叉樹的後序遍歷

問題分析

這三道題目都是關於二叉樹深度優先遍歷的題目,我們在學數據結構時都會接觸到這個題目,不過用的都是遞歸的方法。遞歸的方法思路簡單,代碼簡潔。但是這三道題要求最好不用遞歸而用迭代的方法。用迭代法去解遞歸的題目往往會複雜一點,這裏我們可以用棧來模擬遞歸的過程,從而去解題(棧和遞歸的本質是一致的,具體可以參考這裏。)。
這裏我直接使用數組來模擬棧進行操作。

104題 二叉樹的前序遍歷在這裏插入圖片描述

先看第一題,第一題是前序遍歷,比較簡單。以下面的樹作爲例子。
在這裏插入圖片描述
先建立一個棧,將頭節點入棧。
下面做一個循環判斷,如果棧爲空說明所有節點已經全部處理完畢,如果不爲空,那麼進行出棧操作。先對出棧的節點進行判斷,如果右節點存在,那麼將右節點加入棧,再判斷左節點是否存在,存在就入棧。最後將當前節點的值加入返回數組中,到此這一次循環操作已經結束,進行下一次循環。
最後,當棧爲空時,返回數組。
在這裏插入圖片描述

94題 二叉樹的中序遍歷

在這裏插入圖片描述
第二題是中序遍歷,中序遍歷與前序遍歷不同的是當前節點在判斷左右節點並進行操作後,不立即將節點的值加入返回數組,而是在左子樹所有的節點都加入返回數組後再加入。
開始的做法和前序相同,先建立棧,然後將根節點入棧。在棧不爲空時,對棧頂節點操作,如果棧右節點不爲空,那麼將右節點加入當前棧頂節點的下面;如果左節點爲空(左子樹不存在或者左子樹已經全部處理完),那麼直接將當前節點的值加入返回數組,並將棧頂節點出棧;如果左節點不爲空時,將左節點加入棧頂。此時有一個重要的點,因爲當前節點的左節點不爲空,說明此節點的值不會立即加入返回數組,即還會存在於棧中,所以最後要將節點的左右節點全部賦值爲None。這樣,下次再次遇到此節點時,就不會重複的對左右節點進行操作,而是將節點值直接的加入返回數組(開始我這點沒有想到,所以提交總是不通過)。
在這裏插入圖片描述

145題 二叉樹的後序遍歷

在這裏插入圖片描述
第三題是後序遍歷,後序遍歷與前兩種遍歷不同之處在於,當前節點在判斷左右節點並進行操作後,不立即將節點的值加入返回數組,而是在左右子樹所有的節點都加入返回數組後再加入。
開始的一系列操作和前面相同,此處不再贅餘。
對棧頂的節點先判斷左右節點是否同時爲空,如果是,那麼將節點值加入返回數組,並對棧進行出棧操作;如果不是,判斷右節點是否爲空,不爲空入棧;接着判斷左節點是否爲空,不爲空入棧。同中序一樣,如果左右節點有存在的話,在處理完後,最後將當前節點的左右節點全部賦值爲None,避免下次重複引入節點。在這裏插入圖片描述

源碼

104題 二叉樹的前序遍歷

class Solution:

    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack.pop()
                if node.right:
                    stack.append(node.right)
                if node.left:
                    stack.append(node.left)
                ret.append(node.val)
        return ret

94題 二叉樹的中序遍歷

class Solution:
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack[-1]
                if node.right:
                    stack.insert(-1, node.right)
                if not node.left:
                    ret.append(node.val)
                    stack.pop()
                else:
                    stack.append(node.left)
                    node.left = None
                    node.right = None
        return ret

145題 二叉樹的後序遍歷

class Solution:
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = []
        if root:
            stack.append(root)
            while stack:
                node = stack[-1]
                if not (node.left or node.right):
                    ret.append(node.val)
                    stack.pop()
                    continue
                if node.right:
                    stack.append(node.right)
                if node.left:
                    stack.append(node.left)
                node.right, node.left = None, None
        return ret

謝謝大家,過年回家第一天電腦就壞了,窮鄉僻壤的,兩天才修好。難受~~

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章