LeetCode Binary Tree Preorder Traversal

LeetCode解題之Binary Tree Preorder Traversal


原題

採用非遞歸的方法進行二叉樹的前序遍歷。

注意點:

例子:

輸入:

   1
    \
     2
    /
   3

輸出: [1,2,3]

解題思路

二叉樹進行前序遍歷時,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。可以看出採用遞歸的方法非常簡單,如果不用遞歸,我們可以通過一個棧來輔助遍歷。在先序遍歷中,訪問完根節點,我們接着遍歷它的左子樹,它的右子樹要等左子樹遍歷完成後再遍歷,所以我們先把它存起來。而左子樹的頭節點(區別於根節點)也會有它的右子樹,這棵右子樹需要比之前的右子樹先遍歷(因爲它是根節點的左子樹中的),所以存儲採用棧的結構。當遍歷到某一個節點沒有左子樹後,我們從棧中取出右子樹節點繼續遍歷,直到遍歷完整棵樹。

AC源碼

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        stack = []
        result = []
        while root or stack:
            if not root:
                root = stack.pop()
            result.append(root.val)
            if root.right:
                stack.append(root.right)
            root = root.left
        return result


if __name__ == "__main__":
    None

歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。

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