判断对称二叉树

149 阅读1分钟

一、问题解析

1. 概念

  • 对称二叉树也叫镜像二叉树,我理解是以根节点为中轴线进行折叠后树中所有节点能重合,或者说以根节点为中轴线放一面镜子是不是所有节点都能跟照镜子一样进行映射。

2. 解题

  • 思路1:递归。 简单讲就是从根节点开始检查左右子树,然后再检查左右子树的左右子树。
  • 思路2:迭代。 用队列的思想迭代,就是从根节点砍一刀劈成两部分,按照上下顺序层序入队。

二、代码实现

1. 递归代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return check(root.left, root.right); // 检查root的左右子树
    }

    private boolean check(TreeNode a, TreeNode b) { 
        if (a == null && b == null) return true; // 都为空, 对称
        if (a != null && b == null) return false;
        if (a == null && b != null) return false; // 只有一边为空, 不对称
        if (a.val != b.val) return false; // 都不为空, 但值不相等

        boolean outside = check(a.left, b.right); // 比较a, b两棵树的外侧
        boolean inside = check(a.right, b.left); // 比较a, b两颗树的内测

        return outside && inside; // a, b内外侧都相等才对称
    }
}

2. 迭代代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return check(root, root);
    }

    public boolean check(TreeNode u, TreeNode v) {
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(u);
        q.offer(v);
        while (!q.isEmpty()) {
            u = q.poll();
            v = q.poll();
            if (u == null && v == null) {
                continue;
            }
            if ((u == null || v == null) || (u.val != v.val)) {
                return false;
            }

            q.offer(u.left);
            q.offer(v.right);

            q.offer(u.right);
            q.offer(v.left);
        }
        return true;
    }
}

三、复杂度分析

  • 递归:时间复杂度为O(n), 空间复杂度为O(n)。
  • 迭代:时间复杂度为O(n), 空间复杂度为O(n)。