【每日算法】力扣101. 对称二叉树

233 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

描述

给定一个二叉树,检查它是否是镜像对称的。

  例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
 

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

做题

递归法

停止递归有三个条件:

  1. 当两个节点都为 null(本来就不存在),返回 true。
  2. 当某一个节点为 null,这时已经不对称了,返回 false。
  3. 当两个节点的值相同,返回 true。

这里把第 2、3 结合在一起。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return recurse(root.left,root.right);
    }
    private boolean recurse(TreeNode left,TreeNode right){
        if(left == null && right ==null ){
            return true;
        }
        if(left == null || right == null || left.val != right.val){
            return false;
        }
        //这两个节点相等,继续递归
        return recurse(left.right,right.left) && recurse(left.left,right.right);
    }
}

image.png

迭代法

这里的迭代法和104. 二叉树的最大深度的迭代法差不多。

不同点是,这里是每次放入两个节点,每次取出两个节点来处理。

除此之外,处理逻辑和递归法差不多。

class Solution {
    //迭代法
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root.left);
        queue.offer(root.right);
        TreeNode n = null;
        TreeNode m = null;
        while(!queue.isEmpty()){
            n = queue.poll();
            m = queue.poll();
            if(n == null && m ==null ){
                continue;
            }
            if(n == null || m == null || n.val != m.val){
                return false;
            }
            queue.offer(n.left);
            queue.offer(m.right);
            queue.offer(n.right);
            queue.offer(m.left);
        }
        return true;
    }
}

image.png

这迭代法居然比递归法还要腊鸡。

最后

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。