基礎圖論題目 Symmetric Tree Leetcode #101

閱讀時間約 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




52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
生命密碼基礎圖先教一下大家如何繪製生命密碼圖,利用該圖可以知道自己的組成。 首先,要知道我們的數字只有1~9,當我們的總和超過時,必須將十位數數字和各位數字加總,比如為12,則為1+2=3,數字則為3,知道之後,依下表填入自己的出生年月日。
Thumbnail
avatar
煦銨
2023-07-26
Stable Diffusion基礎 -- 塗鴉(Sketch)本篇要來講述兩個很少用,而且也會讓人很困惑的小功能,塗鴉(Sketch)與局部塗鴉(Inpaint Sketch)。
Thumbnail
avatar
子不語
2023-06-08
Stable Diffusion基礎 -- 圖生圖(img2img)這一篇要來敘述Stable Diffusion的Automatic1111的圖生圖(img2img,簡稱i2i)功能。
Thumbnail
avatar
子不語
2023-05-31
Stable Diffusion基礎 -- 文生圖(txt2img)這一篇要開始來敘述Stable Diffusion的Automatic1111的基礎功能。 一切都要先從最基本的文生圖(txt2img)開始。這是Automatic1111開啟之後的第一個頁面,也是最常用最重要的功能。
Thumbnail
avatar
子不語
2023-05-25
【好課推薦 】給想要提升溝通能力的人 — 學習基礎的圖解技巧來促進交流、解決問題我喜歡的圖解力教練 - 邱奕霖老師要開公開課啦,名稱是《給專業工作者的知識圖解鍊金術》!「圖解」是一種神奇又實用的技能,不但能讓聽者容易懂,還能邀請對方一起動腦想辦法。讓 (1)問題 (2)思考(3)解法都一次呈現在一張圖上,甚至還能用在軟性的生活溝通上。
Thumbnail
avatar
朱騏
2022-09-02
《辣妹學》06 性感睡衣怎麼挑,男生最有感覺?(基礎篇多圖解說)兩性之間就該自己開心大原則下,互相寵愛對方,不然怎叫談戀愛?男生超嚮往女生打造關於性的驚喜。
Thumbnail
avatar
後沙發
2022-08-11
LA37: 人類圖基礎 - 薦骨中心今天我們會講講人類圖的薦骨中心. - 薦骨中心在人類圖中的功能和意義: - 填滿薦骨中心的人 - 給擁有薦骨中心填滿的生產者建議: - 擁有空白的薦骨中心的人 - 給擁有空白薦骨中心的人
Thumbnail
avatar
Life Architect
2022-07-07
【課程】台灣三六八-基礎地圖與離線地圖APP因為撿酒瓶事件,「台灣三六八」大概是最近社會大眾最熟悉的登山商業團體,一直密切各單位的開團開課資訊的邊緣人如me,發現之前三六八也是猛開一波,連「山岳故事分享」都當作課程在開我也是醉了,這種到山屋隨便找個協作或管理員,還怕聽不夠多嗎?(沒上過課純粹亂開槍是我)
Thumbnail
avatar
登山邊緣人
2022-03-14
【Day 15】Matplotlib視覺化教學 - 基礎折線圖今天進入了我們30天衝刺班的一半了,也就是第15天的部分,我們今天要進入視覺化,也就是畫圖的領域了,在先前Day7時我們有聊到,在金融數據分領域上,常用的畫圖模組有兩個,分別是「Matplotlib」以及另一個是「Seaborn」,今天我們就先以「Matplotlib」為主來進行教學吧!!
Thumbnail
avatar
陳陳
2021-03-19
【繪圖基礎】臨摹臨摹,停止憑空想像,觀察並建立概念。一切基礎的基礎。 有計畫的臨摹乃提升繪圖實力之最快捷徑。
avatar
個人心得筆記
2020-08-23