LeetCode #101 Symmetric Tree - 刷題之旅
1 題目描述
檢查是否對稱。
Follow up: Could you solve it both recursively and iteratively?
2 解法
2.1 Recursioin
一樣套用Recursion的思維,我們先將大問題變成小問題
- 大問題:知道一個樹是否對稱
- 小問題:讓我們相信遞歸並假設我們已經透過遞歸給出了根的左子樹和右子樹是否對稱。
- 大小關係式:(left.val == right.val) and (left.left, right.right) and (left.right, right.left)
- 當前的值 and 外面對稱 and 裡面對稱
- 最小的問題:當 left 和 right 都觸底的時候,是對稱的,但是當其中一邊有值,另一邊沒有值,就不對稱了。
我們可以定義一個遞歸函數,它將兩個節點作為輸入,一個來自左子樹,一個來自右子樹。如果兩個節點都為 null,或者它們的值相等且子樹對稱,則輔助函數傳回 true。
大概是這樣的感覺:
1 | class Solution: |
2.2 Iteration
- 初始化隊列:將根節點的左子樹和右子樹成對放入隊列中。
- 迭代檢查:
- 每次從隊列中取出一對節點進行比較。
- 如果兩個節點都為 None,則繼續下一次迭代。
- 如果其中一個節點為 None 或兩個節點的值不相等,則樹不對稱,返回 False。
- 將節點的子節點成對放入隊列中,以便在下一次迭代中檢查:
- inside: 左節點的右子樹與右節點的左子樹成對。
- outside: 左節點的左子樹與右節點的右子樹成對。
- 結束條件:當隊列為空時,表示已經檢查完所有成對的節點,且都對稱,返回 True。
1 | from collections import deque |
3 總結
就差一點點,我還是有偷看解答的前面兩段話獲得hint,差點寫除來,但是很接近了。最後我卡在 left_root.val == right_root.val and outside and inside
一開始我只有意識到 outside and inside
,我是把 left_root.val == right_root.val
當作最小問題來處理,但他還不是最小。最小問題是雙方為None時。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論