給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [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
高階:
你可以運用遞迴和迭代兩種方法解決這個問題嗎?2.1 遞迴
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
issymmetric
(self, root: treenode)
->
bool:if
not root:
return
true
defdfs
(left,right)
:# 遞迴的終止條件是兩個節點都為空
# 或者兩個節點中有乙個為空
# 或者兩個節點的值不相等
ifnot
(left or right)
:return
true
ifnot
(left and right)
:return
false
if left.val!=right.val:
return
false
return dfs(left.left,right.right)
and dfs(left.right,right.left)
# 用遞迴函式,比較左節點,右節點
return dfs(root.left,root.right)
2.2 佇列實現# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
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
複雜度分析
參考:leetcode題解
LeetCode 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 說明 如果你可以遞迴地和迭代地解決它就獎勵你點數。建立乙個映象的樹,然...
LeetCode(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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。這道題也是劍指offer上的2...
leetcode 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思路 如果同時滿足下面的條件,兩個樹互為映象 它們的兩個根結點具有相同的值。每個樹的右子樹都...