在LeetCode中翻转等效二叉树

时间:2020-02-11 18:40:37

标签: java algorithm binary-tree

我试图解决Leetcode中的this问题。

问题如下:

对于二叉树T,我们可以如下定义翻转操作: 任何节点,并交换左右子树。

当且仅当二叉树X翻转等效于二叉树Y 经过几次翻转操作,我们可以使X等于Y。

编写一个确定两个二叉树是否翻转的函数 当量。这些树由根节点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) {
        Queue<TreeNode> q1 = new LinkedList<>();
        Queue<TreeNode> q2 = new LinkedList<>();
        Map<TreeNode,TreeNode> a1 = new HashMap<>();
        Map<TreeNode,TreeNode> a2 = new HashMap<>();
        if(root1!=null){
            q1.add(root1);
            a1.put(root1,null);
        }
        if(root2!=null){
            q2.add(root2);
            a2.put(root2,null);
        }

        while(!q1.isEmpty() && !q2.isEmpty()){
            TreeNode node1 = q1.poll();
            TreeNode node2 = q2.poll();

            // System.out.println(node1.val +" "+node2.val+" ");

            if(node1.val!=node2.val){
                return false;
            }

            if(a1.get(node1)==null){
                if(a2.get(node2)!=null){
                    return false;
                }
            }else{
                if(a2.get(node2)==null){
                    return false;
                }
                // System.out.println(node1.val +" "+node2.val+" "+a1.get(node1).val+" "+a2.get(node2).val+" "+node1+" "+node2);
                if(a1.get(node1).val!=a2.get(node2).val){
                    return false;
                }
            }

            // System.out.println(node1+" "+node2);

            if(node1.left==null && node2.left==null){
                if(node1.right==null && node2.right!=null){
                    return false;
                }else if(node1.right!=null && node2.right==null){
                    return false;
                }else if(node1.right!=null && node2.right!=null){
                    if(node1.right.val!=node2.right.val){
                        return false;
                    }else{
                        q1.add(node1.right);
                        a1.put(node1.right,node1);
                        q2.add(node2.right);
                        a2.put(node2.right,node2);
                    }
                }
            }else if(node1.left==null && node2.left!=null){
                if(node1.right==null){
                    return false;
                }
                if(node2.right!=null){
                    return false;
                }
                if(node1.right.val!=node2.left.val){
                    return false;
                }else{
                    q1.add(node1.right);
                    a1.put(node1.right,node1);
                    q2.add(node2.left);
                    a2.put(node2.left,node2);
                }              
            }else if(node1.left!=null && node2.left==null){
                if(node1.right!=null){
                    return false;
                }
                if(node2.right==null){
                    return false;
                }
                if(node1.left.val!=node2.right.val){
                    return false;
                }else{
                    q1.add(node1.left);
                    a1.put(node1.left,node1);
                    q2.add(node2.right);
                    a2.put(node2.right,node2);
                }
            }else{
                if(node1.left.val!=node2.left.val){
                    if(node2.right==null){
                        return false;
                    }
                    if(node1.right==null){
                        return false;
                    }
                    if(node1.left.val!=node2.right.val){
                        return false;
                    }else{
                        q1.add(node1.left);
                        a1.put(node1.left,node1);
                        q2.add(node2.right);
                        a2.put(node2.right,node2);
                    }
                    if(node1.right.val!=node2.left.val){
                        return false;
                    }else{
                        q1.add(node1.right);
                        a1.put(node1.right,node1);
                        q2.add(node2.left);
                        a2.put(node2.left,node2);
                    }

                }else{
                    if(node1.right==null && node2.right!=null){
                        return false;
                    }else if(node1.right!=null && node2.right==null){
                         return false;
                    }else if(node1.right!=null && node2.right!=null){
                        if(node1.right.val!=node2.right.val){
                            return false;
                        }else{
                            // System.out.println(node1+" "+node2);
                            q1.add(node1.left);
                            a1.put(node1.left,node1);
                            q2.add(node2.left);
                            a2.put(node2.left,node2);
                            q1.add(node1.right);
                            a1.put(node1.right,node1);
                            q2.add(node2.right);
                            a2.put(node2.right,node2);
                        }
                    }
                }
            }


        }

        //System.out.println()

        if(q1.isEmpty() && q2.isEmpty()){
            return true;
        }

        return false;

    }
}

因此,当我提交此解决方案时,我通过了71/72个测试用例,但一次失败。我无法弄清楚我的代码出了什么问题。

失败的测试用例如下:

这是级别顺序中的二叉树的表示。

[0,1,2,3,8,9,4,33,14,18,null,11,10,5,6,94,72,16,54,30,21,27,53, 17,13,25,null,7,12,null,null,null,73,26,19,null,null,null,null,24,37,28,59,null,56,20,null,97, 36,null,62,49,40,15,null,null,null,null,74,34,null,52,32,39,null,29,null,67,87,null,null,22,null, null,null,66,41,null,null,null,85,47,42,35,50,null,null,null,null,null,null,38,55,null,76,58,null,null, null,null,null,31,23,null,null,null,43,92,null,null,null,84,null,95,null,96,null,64,45,null,57,null,null, 61,null,46,60,null,69,93,44,null,null,null,null,99,null,null,null,null,null,48,51,68,83,null,null,65, 81,null,null,null,88,null,null,null,null,null,null,70,63,null,null,null,71,null,null,75,null,null,null,91,null, null,null,79,77,78,98,null,90,null,null,null,null,80,82,null,86,null,null,null,null,null,null,89]

[0,2,1,4,9,8,3,6,5,11,10,18,null,33,14,7,12,null,25,27,53,13,17, 30,21,72,94,16,54,40,49,15,null,62,null,59,28,null,56,36,97,20,null,null,null,37,24,73, null,null,null,26,19,null,null,47,42,null,85,35,50,null,null,67,87,29,null,null,null,41,66,null,null, 22,null,39,null,32,52,null,null,74,null,null,34,null,null,null,84,92,null,95,null,null,96,null,null,null, null,58,null,null,43,null,null,23,31,null,76,55,38,null,null,null,null,null,null,null,null,null,null,null,99, null,null,61,null,44,93,69,null,60,46,null,null,null,57,64,45,null,null,null,null,null,null,null,null,null, 88,null,null,65,81,83,68,null,null,48,51,91,null,75,null,null,null,98,null,null,71,63,70,null,null, null,null,null,90,null,null,null,78,77,79,null,null,null,null,null,86,80,82,null,null,null,null,null,null,null, 89]

此例的预期输出为false,但我返回的是true

如果有人可以指出我在哪里以及为什么我在这方面出错的话,那将是很棒的事情。

2 个答案:

答案 0 :(得分:1)

我不确定您为什么要通过思考级别顺序遍历来解决问题。它很难从代码中读取,但是实际上这个问题很容易解决。您不需要水平订单遍历。

有两个条件:

  • 根的值不相等:

这种情况很简单,立即返回false,因为翻转左,右子树没有意义。

  • 根的值相等:

    • 在这种情况下,您可以先检查而不翻转: 如果根的左子树和右子树与第二根的相应左子树和右子树相等,则不需要任何翻转,只需返回true。

    • 如果它们不相等,请尝试翻转,即您需要检查

      第一个根的左子树==第二个根的右子树&

      第一个根的右子树==第二个根的左子树

您真的不需要翻转元素,只需检查相等性即可。

代码:

     public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        if ( root1 == null && root2 != null ) return false;
        if ( root2 == null && root1 != null ) return false;
        if ( root1 == null && root2 == null ) return true;
        if ( root1.val != root2.val ) return false;
        boolean isLeftEqual = flipEquiv(root1.left, root2.left);
        boolean isRightEqual = flipEquiv(root1.right, root2.right);
        if ( !isLeftEqual || !isRightEqual ) {
            isLeftEqual = flipEquiv(root1.left, root2.right);
            isRightEqual = flipEquiv(root1.right, root2.left);
        }
        return isLeftEqual && isRightEqual;
    }

答案 1 :(得分:-1)

尝试一下:(您都没有检查是否同时离开)

class Solution {
    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        Queue<TreeNode> q1 = new LinkedList<>();
        Queue<TreeNode> q2 = new LinkedList<>();
        Map<TreeNode,TreeNode> a1 = new HashMap<>();
        Map<TreeNode,TreeNode> a2 = new HashMap<>();
        if(root1!=null){
            q1.add(root1);
            a1.put(root1,null);
        }
        if(root2!=null){
            q2.add(root2);
            a2.put(root2,null);
        }

        while(!q1.isEmpty() && !q2.isEmpty()){
            TreeNode node1 = q1.poll();
            TreeNode node2 = q2.poll();

            //System.out.println(node1.val +" "+node2.val+" ");

            if(node1.val!=node2.val){
                return false;
            }

            if(a1.get(node1)==null){
                if(a2.get(node2)!=null){
                    return false;
                }
            }else{
                if(a2.get(node2)==null){
                    return false;
                }
                // System.out.println(node1.val +" "+node2.val+" "+a1.get(node1).val+" "+a2.get(node2).val+" "+node1+" "+node2);
                if(a1.get(node1).val!=a2.get(node2).val){
                    return false;
                }
            }

            //System.out.println(node1+" "+node2);

            //1 right 2 right
            if(node1.left==null && node2.left==null){
                if(node1.right==null && node2.right!=null){
                    return false;
                }else if(node1.right!=null && node2.right==null){
                    return false;
                }else if(node1.right!=null && node2.right!=null){
                    if(node1.right.val!=node2.right.val){
                        return false;
                    }else{
                        q1.add(node1.right);
                        a1.put(node1.right,node1);
                        q2.add(node2.right);
                        a2.put(node2.right,node2);
                    }
                }
            }
            //add this
            //1 left 2 left
            else if(node1.right==null && node2.right==null){
                if(node1.left==null && node2.left!=null){
                    return false;
                }else if(node1.left!=null && node2.left==null){
                    return false;
                }else if(node1.left!=null && node2.left!=null){
                    if(node1.left.val!=node2.left.val){
                        return false;
                    }else{
                        q1.add(node1.left);
                        a1.put(node1.left,node1);
                        q2.add(node2.left);
                        a2.put(node2.left,node2);
                    }
                }
            }
            //1 right 2 left
            else if(node1.left==null && node2.left!=null){
                if(node1.right==null){
                    return false;
                }
                if(node2.right!=null){
                    return false;
                }
                if(node1.right.val!=node2.left.val){
                    return false;
                }else{
                    q1.add(node1.right);
                    a1.put(node1.right,node1);
                    q2.add(node2.left);
                    a2.put(node2.left,node2);
                }              
            }
            //1 left 2 right
            else if(node1.left!=null && node2.left==null){
                if(node1.right!=null){
                    return false;
                }
                if(node2.right==null){
                    return false;
                }
                if(node1.left.val!=node2.right.val){
                    return false;
                }else{
                    q1.add(node1.left);
                    a1.put(node1.left,node1);
                    q2.add(node2.right);
                    a2.put(node2.right,node2);
                }
            }else{
                // 1 left right 2 left right
                if(node1.left.val!=node2.left.val){

                    if(node2.right==null){
                        return false;
                    }
                    if(node1.right==null){
                        return false;
                    }

                    if(node1.left.val!=node2.right.val){
                        return false;
                    }else{
                        q1.add(node1.left);
                        a1.put(node1.left,node1);
                        q2.add(node2.right);
                        a2.put(node2.right,node2);
                    }

                    if(node1.right.val!=node2.left.val){
                        return false;
                    }else{
                        q1.add(node1.right);
                        a1.put(node1.right,node1);
                        q2.add(node2.left);
                        a2.put(node2.left,node2);
                    }

                }else{
                    if(node1.right==null && node2.right!=null){
                        return false;
                    }else if(node1.right!=null && node2.right==null){
                         return false;
                    }else if(node1.right!=null && node2.right!=null){
                        if(node1.right.val!=node2.right.val){
                            return false;
                        }else{

                            q1.add(node1.left);
                            a1.put(node1.left,node1);
                            q2.add(node2.left);
                            a2.put(node2.left,node2);

                            q1.add(node1.right);
                            a1.put(node1.right,node1);
                            q2.add(node2.right);
                            a2.put(node2.right,node2);
                        }
                    }
                }
            }


        }

        System.out.println(a1.size());

        if(q1.isEmpty() && q2.isEmpty()){
            return true;
        }

        return false;

    }
}

(当两个节点都刚刚离开节点时您会想念它,因此您不会在所有树上旅行)