翻轉等價二叉樹

我們可以爲二叉樹 T 定義一個翻轉操作,如下所示:選擇任意節點,然後交換它的左子樹和右子樹。
只要經過一定次數的翻轉操作後,能使 X 等於 Y,我們就稱二叉樹 X 翻轉等價於二叉樹 Y。
編寫一個判斷兩個二叉樹是否是翻轉等價的函數。這些樹由根節點 root1 和 root2 給出。

示例:
輸入: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
解釋:我們翻轉值爲 1,3 以及 5 的三個節點。

在這裏插入圖片描述
算法
存在三種情況:
如果 root1 或者 root2 是 null,那麼只有在他們都爲 null 的情況下這兩個二叉樹纔等價。

如果 root1,root2 的值不相等,那這兩個二叉樹的一定不等價。

如果以上條件都不滿足,也就是當 root1 和 root2 的值相等的情況下,需要繼續判斷 root1 的孩子節點是不是跟 root2 的孩子節點相當。因爲可以做翻轉操作,所以這裏有兩種情況需要去判斷。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        if(root1==root2)return true;
        if(root1==null || root2==null || root1.val!=root2.val)return false;
        return (flipEquiv(root1.left, root2.left) && flipEquiv(root1.right, root2.right) ||
        flipEquiv(root1.left, root2.right) && flipEquiv(root1.right, root2.left));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章