2023-09-21|閱讀時間 ‧ 約 2 分鐘

經典圖論面試題 Invert Binary Tree_Leetcode #226

raw-image

這題的題目在這裡

題目會給我們一顆二元樹的根節點,要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹


測試範例:

Example 1:

Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,3,1]

Example 2:

Input: root = [2,1,3]
Output: [2,3,1]

Example 3:

Input: root = []
Output: []

約束條件:

Constraints:

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

演算法:

利用DFS遞迴探索整顆樹的性質,來進行鏡像反轉

  1. 交換左子樹和右子樹(在程式碼中,就是交換root.left 和 root.right)
  2. 遞迴處理下一層(這邊我們使用DFS 比較簡潔)
  3. 返回樹根root,樹根本身保持不動



程式碼:

class Solution:
 def invertTree(self, root: TreeNode) -> TreeNode:
  
  if root:
   # General case:
   
   # invert child node of current root
   root.left, root.right = root.right, root.left
   
   # invert subtree with DFS
   self.invertTree( root.left )
   self.invertTree( root.right )
   
   return root
  
  else:
   # Base case:
   # empty tree
   
   return None

時間複雜度:

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

空間複雜度:

O( n ) 空間成本耗費在遞迴呼叫時所建立的call stack,

最深的那一層在最後一層,當樹向左歪斜或向右歪斜時,
最深的深度可以到O( n )


Reference:

[1] Python/JS/Java/Go/C++ O(n) by DFS [w/ Visualization] — Invert Binary Tree — LeetCode

分享至
成為作者繼續創作的動力吧!
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
© 2024 vocus All rights reserved.