鏡像二叉樹 + Invert Binary Tree + 對稱二叉樹

一:劍指offer:二叉樹的鏡像

1.1 題意

操作給定的二叉樹,將其變換爲源二叉樹的鏡像。
在這裏插入圖片描述

1.2 思路

這是道簡單題,只需要把左右子樹的值交換就行,先序遍歷,自頂向下進行交換,也就是最左邊節點與最右邊節點交換值,其他也一樣。

改變了二叉樹的形態了,變成對稱的了!

1.3 python實現

class Solution:
    # 返回鏡像樹的根節點
    def Mirror(self, root): # 遞歸來做, 先序遍歷
        # write code here
        if not root: return
        root.left, root.right = root.right, root.left
        self.Mirror(root.left)
        self.Mirror(root.right)

二:leetcode 226. Invert Binary Tree

2.1 題意

給定一棵二叉樹,將其翻轉成對稱的二叉樹,如下圖所示。
在這裏插入圖片描述

2.2 思路

  • 思路一:AC
    先序遍歷,自頂向下來做,對於每一個子樹root,都把左右兒子給交換過來,不是交換值,而是交換了子樹啊!
class Solution(object):
    def invertTree(self, root):
        if not root: return
        root.left, root.right = root.right, root.left  # 交換了子樹
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root
  • 思路二:AC
    需要改變樹的形態,比如左子樹有一個左兒子,而右子樹沒有兒子,
    此時也要把左子樹的左兒子轉移到右子樹的右兒子上面,這種是麻煩的,如同下圖所示:
    在這裏插入圖片描述
    如上圖所示:
    當左右節點都不存在時:return
    當左右節點都存在時:只需要交換左右節點的值就行
    當只存在一個時: 把存在的那一個子樹移植到另外一個不存在的節點那,然後對這個子樹繼續進行convert()

  • 思路三:和思路2相似,只是更加簡單的遞歸來實現。

2.3 python實現

思路二:

class Solution(object):
    def invertTree(self, root):
        
        if not root: return None
        if not root.left and not root.right: return root
        
        def invert(parent1, root1, parent2, root2): # 改變樹的形態,先序遍歷
            if not root1 and not root2: return
            elif root1 and not root2:
                if parent1.left and parent1.left.val == root1.val: # 左兒子
                    parent2.right = root1  # 把左兒子移到右兒子
                    parent1.left = None
                    invert(root1, root1.left, root1, root1.right) # 子樹進行轉化
                else: # 右兒子
                    parent2.left = root1  # 把右兒子移到左兒子
                    parent1.right = None
                    invert(root1, root1.left, root1, root1.right) # 子樹進行轉化
            elif not root1 and root2:
                if parent2.left and parent2.left.val == root2.val: # 左兒子
                    parent1.right = root2  # 把左兒子移到右兒子
                    parent2.left = None
                    invert(root2, root2.left, root2, root2.right) # 子樹進行轉化
                else: # 右兒子
                    parent1.left = root2  # 把右兒子移到左兒子
                    parent2.right = None
                    invert(root2, root2.left, root2, root2.right) # 子樹進行轉化
            else:
                root1.val, root2.val = root2.val, root1.val  # 交換值
                invert(root1, root1.left, root2, root2.right)
                invert(root1, root1.right, root2, root2.left)  
    
        
        invert(root, root.left, root, root.right)
        
        return root

思路三:

class Solution(object):
    def invertTree(self, root): # 後序遍歷,自底向上來改變樹的形態
        if not root: return None
        right = self.invertTree(root.right)
        left = self.invertTree(root.left)
        root.left, root.right = right, left  # 交換左右子樹
        return root

三:劍指offer: 對稱的二叉樹

3.1 題意

請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。

3.2 思路

和上一題有點類似啊,一個是變成對稱,這個更簡單,只需要判斷是否對稱就行了

3.3 python實現

class Solution:
    def isSymmetrical(self, root):
        # write code here
        if not root: return True
        if not root.left and not root.right: return True
        self.res = True
         
        def postOrder(root1, root2):
            if not root1 and not root2: return
            if root1 and not root2:
                self.res = False
                return  # 只存在一個節點
            if not root1 and root2:
                self.res = False
                return
            postOrder(root1.left, root2.right) # 左子樹向左走到最左邊,右子樹向右走到最右邊
            postOrder(root1.right, root2.left)
            if root1.val != root2.val:
                self.res = False
                return
             
             
        postOrder(root.left, root.right)
        return self.res
發佈了40 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章