解題思路:
遞迴:從根節點開始遍歷樹,若乙個樹為空,則該樹為對稱樹,返回true,若這個樹不為空,則使用遞迴判斷其是否為對稱二叉樹。
對稱可以考慮為該節點的左子樹的左子樹和右子樹的右子樹相同。
若乙個二叉樹是對稱的,那麼其子樹肯定也是對稱的,所以可以使用遞迴來判斷。
設定最後跳出的情況為:1.左右節點都為空;2.左右節點有乙個非空;3.左右節點不相等
class
solution
:def
son(self, p, q):if
not(p or q)
:return
true
ifnot
(p and q)
:return
false
if p.val != q.val:
return
false
return self.son(p.left, q.right)
and self.son(p.right, q.left)
defissymmetric
(self, root: treenode)
->
bool:if
not root:
return
true
return self.son(root.left, root.right)
迭代:
使用queue佇列儲存目前比較的左右兩個節點,以上圖中的[1,2,2,3,4,4,3]樹為例,第一步將根節點下的左右節點放入queue佇列中,此時queue為[2,2],left為queue[0],right為queue[1],使用動態迴圈判斷樹的狀態,使得left=queue.pop(0),right = queue.pop(0)(先放左,後放右節點),若左右節點都為空則返回true,若左右節點不相等或者只有乙個是空的節點,則返回false,若相等的話則繼續遍歷,將當前節點的左右節點都新增到queue中,再迴圈pop判斷,直到queue中沒有值為止。
注:在往queue佇列中放入資料的時候要注意放入資料的順序。左子樹的左節點應該緊跟著右子樹的右節點。左子樹的右節點緊跟著右子樹的左節點。(左右節點要對應)
class
solution
(object):
defissymmetric
(self, root):if
not root or
not(root.left or root.right)
:#若樹為空,或者為單個節點
return
true
queue =
[root.left,root.right]
# 用佇列儲存節點
while queue:
# 從佇列中取出兩個節點,再比較這兩個節點
left = queue.pop(0)
right = queue.pop(0)
# 如果兩個節點都為空就繼續迴圈,兩者有乙個為空就返回false
ifnot
(left or right)
:continue
ifnot
(left and right)
:return
false
if left.val!=right.val:
return
false
# 將左節點的左孩子, 右節點的右孩子放入佇列
# 將左節點的右孩子,右節點的左孩子放入佇列
return
true
101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。思路 遞迴就用dfs,迭代是b...
101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。解題思路 對稱二叉樹可以理解...
101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 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 說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。使用輔助空間佇列 defi...