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;
}