基礎圖論題目 Symmetric Tree Leetcode #101

更新於 2024/09/16閱讀時間約 5 分鐘
raw-image

這題題目在這裡:

題目會給定一顆樹,要求我們判定這棵樹是不是左右鏡像對稱(Symmetric)。


測試範例:

Example 1:

raw-image
Input: root = [1,2,2,3,4,4,3]
Output: true

Example 2:

raw-image
Input: root = [1,2,2,null,3,null,3]
Output: false

約束條件:

Constraints:

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

Follow up: Could you solve it both recursively and iteratively?


演算法:

使用到的技巧和前一題Same Tree類似。

這題一樣可以用DFS或是BFS來解,剛好呼應Follow-up 的Recursive遞迴解和 Iterative 迭代解。

範例一的暗示已經很清楚,就是假想樹的正中間有一條虛擬的分割線,把樹拆成左右兩顆子樹,判斷左子樹、右子樹是否以分割線為對稱軸,左右鏡像對稱

DFS、BFS的核心觀念一樣依循同樣的原則:

若左、右子樹皆非空,則判斷當下節點值是否相同,並且用同樣的邏輯去判斷下一層的子樹,在DFS裡面就是遞迴呼叫,在BFS裡面就是推入對應成雙成對鏡像的節點


DFS程式碼:

class Solution:

 def check_symm(self, p:TreeNode, q:TreeNode)->bool:
  
  # Stop condition
  if not(p and q):
   return p == q
  
  # General case:
  # both p and q exist, check symmetry on both child nodes
  return p.val == q.val and self.check_symm( p.left, q.right) and self.check_symm( p.right, q.left)
  
 
 def isSymmetric(self, root: TreeNode) -> bool:
  
  if root is None:
   # empty tree
   return True
  else:
   # check symmetry by function check_symm
   return self.check_symm( root.left, root.right)

時間複雜度:

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

空間複雜度:

O( n ) 樹高最深為O(n),當這顆樹為向左歪斜,或者向右歪斜的時候。


BFS程式碼:

class Solution:

 def isSymmetric(self, root: TreeNode) -> bool:
  
  traversal_queue = deque( [root, root] )

  while traversal_queue:

   # Left half
   L = traversal_queue.popleft()

   # Right half
   R = traversal_queue.popleft()

   # Both Left and Right are empty, i.e., NULL node
   if (not L) and (not R): continue

   # Either L or R is empty, or
   # L's value is not equal to R's value
   if (not L) or (not R) or ( L.val != R.val):
    return False
   
   # Keep compare Left subtree and Right subtree with symmetry judgement
   traversal_queue.append(L.right)
   traversal_queue.append(R.left)
   
   traversal_queue.append(R.right)
   traversal_queue.append(L.left)

  return True

時間複雜度:

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

空間複雜度:

O( n ) 佇列最長為O(n),每個節點最多推入佇列一次,從佇列取出一次。


Reference:

[1] Python O( n ) by DFS and BFS. 87%+ [w/ Visualization] — Symmetric Tree — LeetCode




avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
圖論常用的演算法BFS 與 DFS 的統整與比較。 介紹常用且相關的底層資料結構 並且,介紹幾個適合使用的應用領域、解題分類。
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
圖論常用的演算法BFS 與 DFS 的統整與比較。 介紹常用且相關的底層資料結構 並且,介紹幾個適合使用的應用領域、解題分類。
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
我們時常會發現有些問題不見得有標準答案,也會發現回答問題的人多半站在自己的立場思考,當我們聽到別人的答案時,是否會感到大吃一驚,原來從別人口中吐出的答案竟然是我們未曾想過的觀點! 《森林有多少樹?》這本書便是講述許多動物輪番表達自己對於森林應該有幾棵樹木的看法,每隻動物都基於自己的需求
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
謎題由模式組合而成,是用來破解的,永遠都有預定的秩序,永遠都有明確的答案。憑藉技巧和堅持的精神,一定能把謎題填完。遊戲的輸贏常常是靠運氣和隨機的環境,有偶然的成分,就算擁有全世界的天賦和決心,也未必能在遊戲中取勝。兩者有極大的差異。
Thumbnail
前言 如文章的封面圖片1/2~1/27總共有幾天呢? 如果你的答案是25天,那務必把這個日期的地雷搞懂 種樹問題計算 題目 一條路有50公尺,每10公尺種一棵樹,請問總共種了幾顆樹? 這時就會直覺,阿不就是50/10=5,總共種了5顆樹!! 但其實大錯特錯哦❌
※ 何謂巢狀迴圈(NESTD LOOP): 指的是一個迴圈內包含另一個迴圈的結構。在程式設計中,這種結構常用於需要進行多層次迭代的場合,例如處理多維數組、逐行逐列處理表格資料等。 ※ 例子:九九乘法表 說明: 外層迴圈:for (let i = 1; i <= 9; i = i + 1) 這
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
Node 對我來說一直是很似懂非懂的概念,因為沒有實際可見的數字或字串實物可以觀察中間步驟,比起其他解題抽象許多。以下解題方法來自網友與 GPT 提供的答案,我想在本文中嘗試自己做視覺化圖解,說明 CodeWars - Can you get the loop ? 的解題思路。
Thumbnail
本文將繼續探討『系統思考』一書更深入的説明,以及作者在動態系統分析中所萃煉出來的獨到見解。 中文書名:系統思考:克服盲點、面對複雜性、見樹又見林的整體思考 原文書名:Thinking in Systems: A Primer 作者:Donella H. Meadows
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
我們時常會發現有些問題不見得有標準答案,也會發現回答問題的人多半站在自己的立場思考,當我們聽到別人的答案時,是否會感到大吃一驚,原來從別人口中吐出的答案竟然是我們未曾想過的觀點! 《森林有多少樹?》這本書便是講述許多動物輪番表達自己對於森林應該有幾棵樹木的看法,每隻動物都基於自己的需求
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
謎題由模式組合而成,是用來破解的,永遠都有預定的秩序,永遠都有明確的答案。憑藉技巧和堅持的精神,一定能把謎題填完。遊戲的輸贏常常是靠運氣和隨機的環境,有偶然的成分,就算擁有全世界的天賦和決心,也未必能在遊戲中取勝。兩者有極大的差異。
Thumbnail
前言 如文章的封面圖片1/2~1/27總共有幾天呢? 如果你的答案是25天,那務必把這個日期的地雷搞懂 種樹問題計算 題目 一條路有50公尺,每10公尺種一棵樹,請問總共種了幾顆樹? 這時就會直覺,阿不就是50/10=5,總共種了5顆樹!! 但其實大錯特錯哦❌
※ 何謂巢狀迴圈(NESTD LOOP): 指的是一個迴圈內包含另一個迴圈的結構。在程式設計中,這種結構常用於需要進行多層次迭代的場合,例如處理多維數組、逐行逐列處理表格資料等。 ※ 例子:九九乘法表 說明: 外層迴圈:for (let i = 1; i <= 9; i = i + 1) 這
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
Node 對我來說一直是很似懂非懂的概念,因為沒有實際可見的數字或字串實物可以觀察中間步驟,比起其他解題抽象許多。以下解題方法來自網友與 GPT 提供的答案,我想在本文中嘗試自己做視覺化圖解,說明 CodeWars - Can you get the loop ? 的解題思路。
Thumbnail
本文將繼續探討『系統思考』一書更深入的説明,以及作者在動態系統分析中所萃煉出來的獨到見解。 中文書名:系統思考:克服盲點、面對複雜性、見樹又見林的整體思考 原文書名:Thinking in Systems: A Primer 作者:Donella H. Meadows