1. 程式人生 > 實用技巧 >LeetCode每日一題:951、翻轉二叉樹

LeetCode每日一題:951、翻轉二叉樹

題目描述:

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

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

  編寫一個判斷兩個二叉樹是否是等價的函式。這些書由根節點root1和root2給出。

解題原理:這題跟映象二叉樹判斷有些相似。

  如果兩棵樹互為映象二叉樹,那麼滿足條件

    1、根節點的值相同

    2、每棵樹的左子樹都與另一棵樹的右子樹互為映象對稱。

    3、每棵樹的右子樹都與另一棵樹的左子樹互為映象對稱。

  因為這道題加了翻轉操作,所以滿足上述條件的兩個映象二叉樹一定符合題意。

  那麼本身不用翻轉操作就相等的二叉樹自然符合題意。

  所以遞迴返回的應該是映象二叉樹 || 本身就相等的二叉樹。

    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        // 包含二者都為null
        if(root1==root2){
            return true;
        }

        if(root1==null || root2==null || root1.val!=root2.val ){
            return false;
        }

        return (flipEquiv(root1.left,root2.right) && flipEquiv(root1.right,root2.left) || 
                flipEquiv(root1.left,root2.left) 
&& flipEquiv(root1.right,root2.right) ); }