以勒先生之力扣:100相同的树

100 相同的树

题目

给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

既然是编写两棵树是否相同,那么也就是判断这两个树的每一个相同位置的节点是不是相同,那么第一个思路的要么是采用dfs或者bfs,其实一般情况下对于树的相同问题,这俩都行。

DFS

先用dfs的话,两颗树遍历的方式肯定都是一样的,那么就是需要在遍历的时候做判断,判断到这个节点的时候,首先这俩节点是不是都为null,都为null的话肯定是true,随后,若是有一个不为null,这里是或的关系,那么就肯定要返回false了,因为一个为null一个不为null呀。
接下来就是说,两者都不为null的情况了,那么这里需要判断的就是首先,这两个值是不是相等,相等就继续,不相等就false,若是相等,那么就继续的判断两者的左节点还有两者的右节点,判断左右节点的时候就是用递归了,因为判断的都是一样,是否为null,是否一个为null,是否值相同,继续下一个。

public boolean isSameTree(TreeNode p, TreeNode q) {
    if (p==null&&q==null){
        return true;
    }
    if (p==null||q==null){
        return false;
    }
    if (p.val!=q.val){
        return false;
    }
    return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
其实最后一句换成return  p.val==q.val&&isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);

也行,这样上面那个if语句就可以省略了。

BFS

对于BFS这个算法肯定是要借助与队列的,那么该如何去做呢?

思路

因为BFS是一层层的来做,同时就是每次加的时候,对于两颗树而言,每个节点的位置加进去的顺序是一样,所以一个个弹出来比较就行。
建俩队列,把根节点加进去,while判断这个队列不为null的情况下,弹出两个节点进行判断。
至于判断的方式和条件是一样的,首先是两者是否都为null,这里需要注意的一个点在与说,如果两者都为null的话,那么一定是continue。
这里是和上面的dfs相区别的,因为那个上面采用的是递归,每次就那么一个节点,对了,你直接true就行了。
但这里不行,你的队列每次加入的是每一层的节点,你这里返回true的话,不是相当于说这么一层后面的没判断都是true,那就直接over了,所以要continue,继续的判断这一层下一个节点。
下来就是一个为null,这个false是可以的,因为有一个错,就不满足要求了。
随后就是判断这俩值是否相等,不等返回false,若是相等就将两个节点的左右节点按照顺序加入,若是循环结束都没有问题,说明每一层每个节点都满足条件,那么返回true就行。

public boolean isSameTree(TreeNode p, TreeNode q) {
       Queue<TreeNode> queue1=new LinkedList();
            Queue<TreeNode> queue2=new LinkedList();
            queue1.add(p);
            queue2.add(q);
    while (!queue1.isEmpty()){
        TreeNode treeNode1=queue1.poll();
        TreeNode treeNode2 = queue2.poll();

        if (treeNode1==null&&treeNode2==null){
            continue;
        }
        if (treeNode1==null||treeNode2==null){
            return false;
        }
        if (treeNode1.val!=treeNode2.val){
            return false;
        }
        queue1.add(treeNode1.left);
        queue1.add(treeNode1.right);
        queue2.add(treeNode2.left);
        queue2.add(treeNode2.right);
    }
return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值