以勒先生之力扣:101. 对称二叉树

101 对称二叉树

题目

给定一个二叉树,检查它是否是镜像对称的。
在这里插入图片描述

思路

这个题就和上面那个题是类似到极致的,所谓镜像,不过就是判断在某个位置是否相同罢了,比如左子树的左子节点与右子树的右子节点是否相同,左子树的右子节点与右子树的左子节点是否相同。
那么看过上篇文章的就知道,碰到判断相同一般就是bfs或者dfs。

DFS

思路其实还是和上一篇的一样,创建一个函数,传入的参数分别是两个节点p和q,随后判断这俩节点是否为null,若null则相等,然后是一个为null,那就是false,随后即使在都不为null的情况下,判断其值是否相等,若是相等,那么就判断其子节点是否相等,上一题是按着顺序比较是否相等,但这一题要注意是:左子树的左子节点与右子树的右子节点是否相同,左子树的右子节点与右子树的左子节点。(有些看不懂建议看上一篇的100相同的树)

public boolean isSame(TreeNode treeNode1,TreeNode treeNode2){
        if (treeNode1==null&&treeNode2==null){
            return true;
        }
        if (treeNode1==null||treeNode2==null){
            return false;
        }
        return treeNode1.val==treeNode2.val&&isSame(treeNode1.left,treeNode2.right)&&isSame(treeNode1.right,treeNode2.left);
    }

然后原题中所给的函数只给了一个root节点,怎么调用呢?你直接这样写:

return isSame(root,root);

就是两个都从根节点来比较,这样还顺手可以判断其root是否为null的情况。

BFS

思路

bfs想都不用想肯定是队列的问题,既然还是判断相同,那我们就仍然建两个队列,然后一个一个的弹,进行比较。
两个队列都加入根节点,这个原因和上面最后递归调用写两个root是一样的原因。
随后就是老套的当队列不为null 的while循环。
然后弹出来进行判断,是否都为null,true的话就是continue,为什么是continue上一篇(100相同的树)已经解释过。一个为null就是false,都不为空的时候值不为null就是false,相等的话就加入下面的节点进行比较,这里加节点的时候要注意,不是无脑的按着上次的顺序加入,而是第一个队列加左子树的左右节点,第二个队列要加的是右子树的右左节点,这样才符合左右对称的镜像要求,最后这个while结束说明符合,则返回true。

  public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> nodeQueue1=new LinkedList<>();
        Queue<TreeNode> nodeQueue2=new LinkedList<>();
        nodeQueue1.add(root);
        nodeQueue2.add(root);
        while (!nodeQueue1.isEmpty()){
            TreeNode treeNode1 = nodeQueue1.poll();
            TreeNode treeNode2 = nodeQueue2.poll();
            if (treeNode1==null&&treeNode2==null){
                continue;
            }
            if (treeNode1==null||treeNode2==null){
                return false;
            }
            if (treeNode1.val!=treeNode2.val){
                return false;
            }
            nodeQueue1.add(treeNode1.left);
            nodeQueue1.add(treeNode1.right);
            nodeQueue2.add(treeNode2.right);
            nodeQueue2.add(treeNode2.left);
        }
        return true;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值