GuilinDev

Lc0951

05 August 2008

951. Flip Equivalent Binary Trees

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

当且仅当我们可以在经过一定次数的翻转操作后使 X 等于 Y 时,二叉树 X 与二叉树 Y 翻转等效。

给定两棵二叉树 root1 和 root2 的根,如果两棵树翻转等价,则返回 true,否则返回 false。

Recursive

1
2
3
4
5
6
7
8
9
10
class Solution {
    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        if (root1 == null && root2 == null) return true;
        if (root1 == null || root2 == null) return false;

        if (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));
    }
}

Iterative

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
    public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        Queue<TreeNode> queue = new LinkedList<>();
        if (root1 == null && root2 == null)
            return true;
        if (root1 == null || root2 == null)
            return false;
        queue.add(root1);
        queue.add(root2);

        while (!queue.isEmpty()) {
            TreeNode a = queue.poll();
            TreeNode b = queue.poll();
            Integer valA = (a != null) ? a.val : null;
            Integer valB = (b != null) ? b.val : null;
            if (valA != valB) {
                return false;
            }
            Integer valAL = (a == null || a.left == null) ? null : a.left.val;
            Integer valAR = (a == null || a.right == null) ? null : a.right.val;
            Integer valBL = (b == null || b.left == null) ? null : b.left.val;
            Integer valBR = (b == null || b.right == null) ? null : b.right.val;
            if (valAL == valBR && valAR == valBL) {
                if (valA != null)
                    queue.add(a.left);
                if (valB != null)
                    queue.add(b.right);
                if (valA != null)
                    queue.add(a.right);
                if (valB != null)
                    queue.add(b.left);
            } else {
                if (valA != null)
                    queue.add(a.left);
                if (valB != null)
                    queue.add(b.left);
                if (valA != null)
                    queue.add(a.right);
                if (valB != null)
                    queue.add(b.right);
            }
        }
        return true;
    }
}