BFS 經典入門題 Binary Tree Level Order Traversal II Leetcode #107

2023/09/21閱讀時間約 4 分鐘
raw-image

這題的題目在這

題目會給定給我們一顆二元樹的根結點,要求我們輸出上下顛倒的Level-order traversal的拜訪結果。

(基本上,就是前一題的小改版。 XD)


測試範例:

Example 1:

raw-image
Input: root = [3,9,20,null,null,15,7]
Output: [[15,7],[9,20],[3]]

Example 2:

Input: root = [1]
Output: [[1]]

Example 3:

Input: root = []
Output: []

約束條件:

Constraints:

  • The number of nodes in the tree is in the range [0, 2000].
  • -1000 <= Node.val <= 1000

演算法:

和前一題一樣,這題就剛好可以套用圖論裡面的BFS廣度優先探索演算法,也呼應之前我們在圖論演算法統整介紹過的概念。

BFS在探索Tree/Binary tree相關的領域中,還有一個名字,叫做Level-order traversal 逐層探索演算法從第一層Root根接點,逐層探索到Leaf葉子節點 也是最深的那一層

唯一的差別是,這題要求的是上下顛倒的順序

所以,我們只要套用前一題的演算法,最後把結果做反向,再輸出,就滿足題目所求。

這種演算法化簡的技巧,在演算法理論也稱之為Reduction

把一個新的問題A,映射到一個已經知道解法(演算法)的問題B,再透過已知問題B的解答反推問題A的答案


程式碼:

class Solution:
 def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
 
  def levelOrder(root: TreeNode) -> List[List[int]]:
  
  
   if not root:
    # Quick response for empty tree
    return []

   traversalQ, result = deque([root]), []

   # level order traversal
   while traversalQ:

    # going down level-by-level
    cur_level_trace, cur_level_len = [], len(traversalQ)
    for _ in range(cur_level_len):

     cur_node = traversalQ.popleft()

     cur_level_trace.append(cur_node.val)
     if cur_node.left: traversalQ.append( cur_node.left )
     if cur_node.right: traversalQ.append( cur_node.right )


    result.append( cur_level_trace )

   return result
  
  #-----------------------------------
  
  # Reduce to Leetcode #102 Binary tree level order traversal
  
  return levelOrder(root)[::-1]

時間複雜度:

O( n ) 每個節點最多拜訪一次。

空間複雜度:

O( n ) 最深的那一層在最後一層,最長為O( n/2 )


[1] Python/Java/JS/C++/Go by normal traversal // Reduction [w/Hint] — Binary Tree Level Order Traversal II — LeetCode


46會員
290內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!