更多題目移步【力扣簡單題】
題目
難度:★☆☆☆☆
類型:二叉樹
給定一個二叉樹辱士,檢查它是否是鏡像對稱的。
示例
例如颂碘,二叉樹 [1,2,2,3,4,4,3] 是對稱的椅挣。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:
1
/ \
2 2
\ \
3 3
說明:
如果你可以運用遞歸和迭代兩種方法解決這個問題,會很加分峡竣。
解答
這道題和【100.相同的樹】很類似量九,我們可以使用遞歸和隊列兩種方式實現(xiàn)颂碧。
方案1:遞歸
對稱的樹的左子樹和右子樹滿足以下條件:
如果左子樹或右子樹均為空载城,則該樹對稱戚宦;
如果左子樹或右子樹只有一個為空,則該樹不對稱垦搬;
如果左子樹和右子樹均不為空艳汽,當左子樹的左子樹和右子樹的右子樹鏡像對稱,且左子樹的右子樹和右子樹的左子樹鏡像對稱時米绕,該樹對稱馋艺。
class Solution:
def isSymmetric(self, root):
"""
遞歸
:param root:
:return:
"""
def is_mirror(p, q): # 判斷左右子樹是否鏡像對稱
if not p and not q:
return True
elif not p and q or p and not q:
return False
else:
return p.val == q.val and is_mirror(p.left, q.right) and is_mirror(p.right, q.left)
return is_mirror(root, root)
方案2:隊列
對根節(jié)點進行非空判斷捐祠,將根節(jié)點的左右子樹放在一個隊列中;
每次成對取出節(jié)點窿给,這兩個節(jié)點其實是二叉樹的對稱位置率拒,判斷這兩個節(jié)點的相等情況:
(1)如果兩結點均為空,則繼續(xù)下一輪循環(huán)角撞;
(2)如果兩結點只有一個是空勃痴,直接返回Fasle;
(3)如果兩結點都不為空百炬,且它們的數(shù)值不同污它,也直接返回False;
(4)此時兩結點的數(shù)值一定相等德澈,將它們的左右子結點逆序加入到隊列中固惯,保證每一對結點都是對稱的位置。如果到最后镇辉,隊列中為空贴捡,則二叉樹對稱,返回True屹逛。
class Solution:
def isSymmetric(self, root):
"""
隊列
:param root:
:return:
"""
if not root:
return True
node_queue = [root.left, root.right] # 在空隊列中加入左子樹和右子樹
while node_queue:
left = node_queue.pop(0) # 依次彈出兩個元素
right = node_queue.pop(0)
if not right and not left: # 如果均為空汛骂,繼續(xù)下一個循環(huán)
continue
if not right or not left: # 如果只有一個為空,返回False
return False
if left.val != right.val: # 都非空淑掌,再判斷值是否相等
return False
node_queue.append(left.left) # 將兩個左右子樹的左右子樹逆序加入隊列
node_queue.append(right.right)
node_queue.append(left.right)
node_queue.append(right.left)
return True
如有疑問或建議锋拖,歡迎評論區(qū)留言~