【LeetCode】101. 對稱樹

問題描述

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Bonus points if you could solve it both recursively and iteratively.

給定一個二叉樹,檢查它是否是自身的鏡像(即圍繞其中心對稱)。
最好能遞歸地和迭代地解決它。

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

 

Python 實現

實現一:遞歸實現(Recursively)

思路很簡單,分別從左右兩個子樹鏡像比較節點的值是否相等。

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        
        if root == None:
            return True

        # Recursively.
        return self.isEqual(root.left, root.right)
    
    def isEqual(self, n1, n2):
        if n1 == None and n2 == None:
            return True
        elif n1 == None or n2 == None:
            return False
        elif n1.val == n2.val:
            return self.isEqual(n1.left, n2.right) and self.isEqual(n1.right, n2.left)
        else:
            return False

實現二:迭代實現(Iteratively)

迭代法稍微比較難理解,不過基本思路跟 BFS (廣度優先搜索 BreadthFirstSearch)類似。對於根節點而言,左右子樹分別用一個列表來儲存,這兩個列表當作是兩個棧(stack)來使用。左列表用於處理左子樹,右列表用於處理左子樹(注意,這裏的左右列表僅僅針對根節點而言)。

每一次比較,都是取左列表的第一個元素與右列表的最後一個元素進行比較(可以理解成是樹用中序遍歷表示時,取得第一個節點與最後一個節點,在這個題目裏這兩個節點位置是對稱的)。如果兩個元素的值(val)相等,則同時出棧,即移出列表,然後分別用他們的子樹替代原本在列表中的位置(這一步就跟 BFS 的實現一致)。

這樣,在過程只要出現兩個比較節點的值不相等,或者兩個比較節點不同時存在,則說明樹不是對稱的。

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        
        if root == None:
            return True
        
        # Iteratively.
        if root.left == None and root.right == None:
            return True
        if root.left == None or root.right == None:
            return False
        
        left_list = [root.left]
        right_list = [root.right]
        while len(left_list) > 0 and len(right_list) > 0:
            if left_list[0].val == right_list[-1].val:
                n1 = left_list.pop(0)
                n2 = right_list.pop(-1)
                
                if n1.right != None and n2.left != None:
                    left_list.insert(0, n1.right)
                    right_list.append(n2.left)
                elif n1.right == None and n2.left == None:
                    pass
                else:
                    return False
                
                if n1.left != None and n2.right != None:
                    left_list.insert(0, n1.left)
                    right_list.append(n2.right)
                elif n1.left == None and n2.right == None:
                    pass
                else:
                    return False
            else:
                return False
        return True
                

鏈接:https://leetcode.com/problems/symmetric-tree/

發佈了46 篇原創文章 · 獲贊 29 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章