我們之前深入了解鏈結串列。今天,我們學習「樹」這種複雜的資料結構。
題目連結: 100. Same Tree
題目描述:給你兩棵二元樹的根節點 p 和 q,判斷兩棵樹是否相同。
Input: p = [1,2,3], q = [1,2,3]
Output: true
Input: p = [1,2,1], q = [1,1,2]
Output: false
解題思路:
處理樹的問題,最自然的思考方式就是 遞迴。我們可以把一個大問題(判斷整棵樹是否相同)分解成數個小問題(判斷當前節點和它們的子樹是否相同)。
isSameTree(p, q)
需要回答一個問題:「p 和 q 這兩個節點以及它們代表的子樹是否相同?」
兩個節點都是 None
return True
。其中一個節點是 None,另一個不是
return False
。兩個節點都不是 None,但它們的值不相等
return False
。class Solution:
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
if p == None or q ==None:
if p == q:
return True
else:
return False
return p.val == q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
演算法分析:
and self.isSameTree(p.left,q.left)
如果當前節點的值相等,就繼續遞迴地檢查它們的左子樹是否也相同。如果左子樹不同,遞迴呼叫會返回 False,and 鏈同樣會中斷。and self.isSameTree(p.right,q.right)
如果左子樹也相同,就做最後一步檢查:遞迴地檢查它們的右子樹是否也相同。複雜度分析:
時間複雜度為 O(n)
。
空間複雜度: O(n)
。
O(log n)
。O(n)
。有問題可以底下留言!
下回見!!