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

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

更新於 發佈於 閱讀時間約 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


avatar-img
小松鼠的演算法樂園
95會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言
avatar-img
留言分享你的想法!
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。