1. 程式人生 > >Leetcode——二叉樹的層次遍歷

Leetcode——二叉樹的層次遍歷

給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。

例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其層次遍歷結果:

[
[3],
[9,20],
[15,7]
]
思路:
層次遍歷需要藉助佇列這樣一個輔助的資料結構。
1.題目給出從左到右訪問節點,自然想到的就是BFS,廣度優先搜尋。每個節點訪問且僅訪問一次。所以時間複雜度是O(N),根節點先入佇列,然後佇列不空,取出頭元素,如果左孩子存在就入佇列,否則什麼都不做,右孩子同理。知道佇列為空,則表示樹層次遍歷結束。
2.深度優先搜尋DFS,也可以做。但是最好還是BFS

程式碼:(BFS)

class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []        #若根節點為空,則返回空列表
        result = []     		#模擬一個佇列儲存節點
        queue = collections.deque()  #雙端佇列
        queue.append(root)     #首先將根節點入隊
        
        while queue:
            level_size = len(queue)	#記錄同層節點的個數
            current_level = []            #使用列表來儲存同層節點
            
            for _ in range(level_size):
                node = queue.popleft()			#將同層節點依次出隊
                current_level.append(node.val)
                if node.left: queue.append(node.left)		#非空左孩子入隊
                if node.right: queue.append(node.right)	#非空右孩子入隊
            result.append(current_level)
        return result