[劍指Offer] 28_對稱二叉樹
阿新 • • 發佈:2019-01-13
題目
請實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼他是對稱的。
例:
思路
- 生成一棵映象樹,再逐一比對。
- 時間複雜度:O(n),但是慢於下面兩種,因為要遍歷2次。
- 空間複雜度:O(n)
- 遞迴比較,雙指標,一個按父-左-右遍歷,一個按父-右-左遍歷,每一步都比較兩者是否相等。
- 時間複雜度:O(n)
- 空間複雜度:O(n)
- 迭代比較,類似深度優先搜尋,建立一個列表,每次彈出頭第1、2個節點進行比較,按1左2右1右2左的順序將下一次需要比較的節點存入隊尾,直到列表清空或出現不等。
- 時間複雜度:O(n)
- 空間複雜度:O(n)
程式碼
思路2:時間複雜度:O(n),空間複雜度:O(n)
def is_symmetrical(root):
"""
:param root: root
:return: bool
"""
def re_core(preorder, symm_preoder):
if not preorder and not symm_preoder:
return True
if not preorder or not symm_preoder:
return False
if preorder.val == symm_preoder.val:
return re_core(preorder.left, symm_preoder.right) and re_core(preorder.right, symm_preoder.left)
return re_core(root, root)
思路3:時間複雜度:O(n),空間複雜度:O(n)
def isSymmetric(root):
"""
:type root: TreeNode
:rtype: bool
"""
layer = [root, root]
while layer:
left = layer.pop(0)
right = layer.pop(0)
if not left and not right:
continue
if not left or not right:
return False
if left.val == right.val:
layer.extend([left.left, right.right, left.right, right.left])
else:
return False
return True