《Leedcode》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

思路:關於樹的問題,儘量用遞歸的思想去解決。因爲樹的定義也是遞歸定義的。何爲鏡像對稱呢?就是這個樹的左子樹和右子樹的節點都是對稱的。①遞歸法:因此可以把這個樹copy一份,變成兩個樹,然後觀察這兩個樹的左子樹和右子樹是不是對稱的,也就是右子樹的左節點等於左子樹的右節點,這樣遞歸的判斷下去。最終就可以判斷出來這棵樹是不是鏡像對稱。②迭代法:總體思路和遞歸相差不是太大,定義一個隊列,然後一次加入一對節點,然後去判斷節點的值是不是相同。

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 isSymmetricJudge(self,left,right):
        #如果左右子樹都是空的,那麼就是鏡面對稱
        if left is None and right is None:
            return True
        #如果左右子樹有一個子樹是空,另一個非空,那肯定不是鏡面對稱
        if left is None or right is  None:
            return False
        #接下來就詳細的判斷,節點的值必須相同,且遞歸的判斷左節點的左和右節點的右;
        #左節點的右和右節點的左相等
        return left.val==right.val and self.isSymmetricJudge(left.left,right.right) and self.isSymmetricJudge(left.right,right.left)
    def isSymmetric(self, root: TreeNode) -> bool:
        #如果樹爲空,就是對稱樹
        if not root:
            return True
        else:
            return self.isSymmetricJudge(root,root)

2、迭代法

# 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:
        #定義一個隊列
        queue = collections.deque()
        #加入一對根節點
        queue.append((root, root))
        while queue:
            #從隊列中取出元素
            left, right = queue.popleft()
            if not left and not right:
                continue
            if not left or not right:
                return False
            if left.val != right.val:
                return False
            #加入左子樹的左節點和右子樹的右節點
            #加入右子樹的左節點和左子樹的右節點
            queue.append((left.left, right.right))
            queue.append((left.right, right.left))
        return True

總結:處理二叉樹的問題儘量用遞歸,但是遞歸往往和迭代是分不開的,在進行迭代時多用隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章