101. 對稱二叉樹(Python)

更多題目移步【力扣簡單題】

題目

難度:★☆☆☆☆
類型:二叉樹

給定一個二叉樹,檢查它是否是鏡像對稱的。

示例

例如,二叉樹 [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

說明:

如果你可以運(yùn)用遞歸和迭代兩種方法解決這個問題,會很加分。

解答

這道題和【100.相同的樹】很類似,我們可以使用遞歸和隊(duì)列兩種方式實(shí)現(xiàn)。

方案1:遞歸

對稱的樹的左子樹和右子樹滿足以下條件:

  1. 如果左子樹或右子樹均為空,則該樹對稱;

  2. 如果左子樹或右子樹只有一個為空,則該樹不對稱;

  3. 如果左子樹和右子樹均不為空,當(dāng)左子樹的左子樹和右子樹的右子樹鏡像對稱,且左子樹的右子樹和右子樹的左子樹鏡像對稱時(shí),該樹對稱。

class Solution:
    def isSymmetric(self, root):
        """
        遞歸
        :param root:
        :return:
        """
        def is_mirror(p, q):         # 判斷左右子樹是否鏡像對稱
            if not p and not q:
                return True
            elif not p and q or p and not q:
                return False
            else:
                return p.val == q.val and is_mirror(p.left, q.right) and is_mirror(p.right, q.left)

        return is_mirror(root, root)

方案2:隊(duì)列

  1. 對根節(jié)點(diǎn)進(jìn)行非空判斷,將根節(jié)點(diǎn)的左右子樹放在一個隊(duì)列中;

  2. 每次成對取出節(jié)點(diǎn),這兩個節(jié)點(diǎn)其實(shí)是二叉樹的對稱位置,判斷這兩個節(jié)點(diǎn)的相等情況:
    (1)如果兩結(jié)點(diǎn)均為空,則繼續(xù)下一輪循環(huán);
    (2)如果兩結(jié)點(diǎn)只有一個是空,直接返回Fasle;
    (3)如果兩結(jié)點(diǎn)都不為空,且它們的數(shù)值不同,也直接返回False;
    (4)此時(shí)兩結(jié)點(diǎn)的數(shù)值一定相等,將它們的左右子結(jié)點(diǎn)逆序加入到隊(duì)列中,保證每一對結(jié)點(diǎn)都是對稱的位置。

  3. 如果到最后,隊(duì)列中為空,則二叉樹對稱,返回True。

class Solution:
    def isSymmetric(self, root):
        """
        隊(duì)列
        :param root:
        :return:
        """

        if not root:
            return True

        node_queue = [root.left, root.right]    # 在空隊(duì)列中加入左子樹和右子樹

        while node_queue:
            left = node_queue.pop(0)            # 依次彈出兩個元素
            right = node_queue.pop(0)

            if not right and not left:          # 如果均為空,繼續(xù)下一個循環(huán)
                continue
            if not right or not left:           # 如果只有一個為空,返回False
                return False

            if left.val != right.val:           # 都非空,再判斷值是否相等
                return False

            node_queue.append(left.left)        # 將兩個左右子樹的左右子樹逆序加入隊(duì)列
            node_queue.append(right.right)
            node_queue.append(left.right)
            node_queue.append(right.left)

        return True

如有疑問或建議,歡迎評論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容