項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Leetcode】python – [102] Binary Tree Level Order Traversal 個人解法筆記 (updated: 2022/4/7)

題目出處

102. Binary Tree Level Order Traversal

難度

medium

題目分類

Tree, Breadth-First Search, Binary Tree

個人範例程式碼 – 第二版:2022/4/7

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if root is None:
            return []

        queue = [root]
        ans = []
        while(queue):
            tmp_queue = []
            tmp_ans = []
            for ele in queue:
                tmp_ans.append(ele.val)
                if ele.left is not None:
                    tmp_queue.append(ele.left)
                if ele.right is not None:
                    tmp_queue.append(ele.right)
            ans.append(tmp_ans)
            queue = tmp_queue
        else:
            return ans

算法說明

BFS traversal,搭配 Queue 即可完成。
這題沒有發揮 Queue 的 FIFO 特性,但要使用也是可以的。

  • 無聊記:Queue = pop(0),Q 長的很像 0…
  • 比較 Stack = pop(-1) 或 pop ()

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

input handling

處理 input 為 None 的情況,輸出 []。

Boundary conditions

注意:BFS 結束條件為,「當 Queue 不再有東西的時候」。

個人範例程式碼 – 第一版:2022/3/19

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        this_level = [root]
        if root:
            while(this_level):
                this_level_val = []
                next_level = []   
                for node in this_level:
                    this_level_val.append(node.val)
                    if node.left:
                        next_level.append(node.left)
                    if node.right:
                        next_level.append(node.right)
                ans.append(this_level_val)
                this_level = next_level

        return ans

算法說明

既然是 level order,我們的思路是使用一層一層的方式下去把答案兜出來。

corner case 特殊情況處理

當樹為空 [] 或 為只有 root [1] 時,需要注意。

Boundary conditions/ Edge conditions 邊際情況處理

原本的做法我是到最後一層才做檢查「if root」,
不過如果是採取這樣的作法,會多一層只有「None 的 layer」,
我們需要特別留意儲存的最後一層。

Reference

⭐ Leetcode 解題紀錄 ⭐題型資料結構Python SolutionC++ SolutionNote
⭐BFS 相關題型 ⭐
104Maximum Depth of Binary TreeBFS (分層)Python
94Binary Tree Inorder TraversalBFS (分層)TreePython 內含 處理 Tree 樹問題的重點
102Binary Tree Level Order TraversalBFS (分層)TreePython
103Binary Tree Zigzag Level Order TraversalBFS (分層)TreePython
107Binary Tree Level Order Traversal IIBFS (分層)TreePython
133Clone GraphBFS (分層)Graph