给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
分析:题意是判断是否有相同的值及结构才判断为相同 故从这出发思考,比值比结构;
*把两棵树结点放队列里一一取出来对比,如果值不等或结构不一样就返回false否则返回true 在值等
前提下判断结构是否一样;队列是先进先出,层层遍历对比。
*中间出了很多空指针异常,自己注意修改临界边值。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
*把两棵树结点放对列里一一取出来对比,如果值不等或结构不一样就返回false否则返回true 在值等
前提下判断结构是否一样;
*中间出了很多空指针异常
*
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
//不加会引发空指针异常
if (p == null && q == null){
return true;
}else if (p == null || q == null){
return false;
}
//队列是一层层遍历对比,创建两个队列
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
queue1.add(p);
queue2.add(q);
//先大体判断下长度
if(queue1.size()==queue2.size()){
//不断循环遍历
while((!queue1.isEmpty()) && (!queue2.isEmpty())){
TreeNode pNode1= queue1.poll();
TreeNode pNode2= queue2.poll();
//如果对应结点都为空直接下次循环,没有这判断下面if判断得报异常
if(pNode1 ==null && pNode2==null) {
continue;
}
//(pNode1!=null) && (pNode2 !=null )与(pNode1.val!=null) && (pNode2.val !=null )区别,后面的是不对的
//如果值相等得在判断位置结构是否一样,并不断往队列放入值
if(pNode1.val == pNode2.val){
//判断左结点结构是否一样是否
if ((pNode1.left==null&&pNode2.left !=null) ||(pNode1.left!=null &&pNode2.left==null)) {
return false;
}else {
queue1.add(pNode1.left);
queue2.add(pNode2.left);
}
//判断右结点结构是否一样
if ((pNode1.right==null && pNode2.right !=null) || (pNode1.right!=null && pNode2.right ==null)) {
return false;
}else {
queue1.add(pNode1.right);
queue2.add(pNode2.right);
}
}else {
return false;
}
}
}else{
return false;
}
return true;
}
}