1. 程式人生 > >[劍指Offer] 28_對稱二叉樹

[劍指Offer] 28_對稱二叉樹

題目

請實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼他是對稱的。

例:
在這裡插入圖片描述


思路

  1. 生成一棵映象樹,再逐一比對。
    1. 時間複雜度:O(n),但是慢於下面兩種,因為要遍歷2次。
    2. 空間複雜度:O(n)
  2. 遞迴比較,雙指標,一個按父-左-右遍歷,一個按父-右-左遍歷,每一步都比較兩者是否相等。
    1. 時間複雜度:O(n)
    2. 空間複雜度:O(n)
  3. 迭代比較,類似深度優先搜尋,建立一個列表,每次彈出頭第1、2個節點進行比較,按1左2右1右2左的順序將下一次需要比較的節點存入隊尾,直到列表清空或出現不等。
    1. 時間複雜度:O(n)
    2. 空間複雜度: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

思考

LeetCode 101. 對稱二叉樹