101 對稱二叉樹(簡單)

2021-10-01 12:55:52 字數 1854 閱讀 6398

解題思路:

遞迴:從根節點開始遍歷樹,若乙個樹為空,則該樹為對稱樹,返回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...