1. 程式人生 > >Leetcode 951:翻轉等價二叉樹(超詳細的解法!!!)

Leetcode 951:翻轉等價二叉樹(超詳細的解法!!!)

我們可以為二叉樹 T 定義一個翻轉操作,如下所示:選擇任意節點,然後交換它的左子樹和右子樹。

只要經過一定次數的翻轉操作後,能使 X 等於 Y,我們就稱二叉樹 X 翻轉等價於二叉樹 Y。

編寫一個判斷兩個二叉樹是否是翻轉等價的函式。這些樹由根節點 root1root2 給出。

示例:

輸入:root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5,null,null,null,null,8,7]
輸出:true
解釋:We flipped at nodes with values 1, 3, and 5.

提示:

  1. 每棵樹最多有 100 個節點。
  2. 每棵樹中的每個值都是唯一的、在 [0, 99] 範圍內的整數。

解題思路

這個問題很明顯通過遞迴來解決。我們定義函式 f ( r o o t

1 , r o o t 2 ) f(root_1,root_2)
表示以 r o o t 1 root_1 r o o t 2 root_2 為根的結果,那麼 f ( r o o t 1 , r o o t 2 ) = ( f ( r o o t 1 . l e f t , r o o t 2 . l e f t ) & f ( r o o t 1 . r i g h t , r o o t 2 . r i g h t ) ) ( f ( r o o t 1 . l e f t , r o o t 2 . r i g h t ) & f ( r o o t 1 . r i g h t , r o o t 2 . l e f t ) ) f(root_1,root_2)=(f(root_1.left, root_2.left)\&f(root_1.right,root_2.right))||(f(root_1.left, root_2.right)\&f(root_1.right,root_2.left)) 。我們接著考慮邊界問題,我們判斷 r o o t 1 = = N o n e r o o t 2 = = N o n e root_1==None||root_2==None ,如果成立的話,我們要返回 r o o t 1 = = r o o t 2 root_1==root_2 。我們還要判斷 r o o t 1 . v a l r o o t 2 . v a l root_1.val\neq root_2.val ,如果成立的話,我們返回 F a l s e False

class Solution:
    def flipEquiv(self, root1, root2):
        """
        :type root1: TreeNode
        :type root2: TreeNode
        :rtype: bool
        """
        if root1 == None or root2 == None:
            return root1 == root2
        
        if root1.val != root2.val:
            return False
        
        return (self.flipEquiv(root1.left, root2.left) and self.flipEquiv(root1.right, root2.right)) or\
               (self.flipEquiv(root1.left, root2.right) and self.flipEquiv(root1.right, root2.left))

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!