题目:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
解题思路 1:
【深度优先】
先查看根节点是否为null;
如果两个根节点都为null,则返回true;
如果一个根节点为null,一个根节点不为null,则返回false;
判断根节点的值是否相等:
如果相等,则返回true;
如果不相等,则返回false;
递归与判断左右子节点即可。
代码如下:
//java class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { //deep first if(p==null && q==null){ return true; }else if(p==null || q==null){ return false; }else if(p.val!=q.val ){ return false; }else{ return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right); } } }
解题思路 1:
【广度优先】
广度优先就需要两个额外的队列来存放节点,并且在初始化时,将两个树的根节点都存放如队列中;
先判断两个树的根节点是否都为null:
是的话,就返回true;
有一个为null的话,就返回false;
都不为null的话,继续执行;
while()循环遍历两个队列,条件是两个队列都不为null;
将两个队列的头部节点(p,q)都取出来,判断:
如果两个节点(p,q)的值不相等,就返回false;
判断两个节点(p,q)的左右子节点是否为空:
如果p.left和q.left只有一个为null 或者 p.right和q.right只有一个为null,则返回false;
分别判断两个节点(p,q)是否为空:
如果左节点不为null,则加入queue
如果右节点不为null,则加入queue
代码如下:
class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { //breadth first if(p==null && q==null){ return true; }else if(p==null || q==null){ return false; } Queue<TreeNode> queue1 = new LinkedList<TreeNode>(); Queue<TreeNode> queue2 = new LinkedList<TreeNode>(); queue1.offer(p); queue2.offer(q); while(!queue1.isEmpty() && !queue2.isEmpty()){ TreeNode pnode = queue1.poll(); TreeNode qnode = queue2.poll();
//在这里不用判断这两个节点是否为null,因为第一次添加到队列中的node是不为null的根节点,以后再添加到队列中的节点在
//下面会判断,所以在这里仅仅需要判断节点的值是否相等即可。 if(pnode.val != qnode.val){ return false; } if(pnode.left==null && qnode.left!=null || pnode.left!=null && qnode.left==null pnode.right==null && qnode.right!=null || pnode.right!=null && qnode.right==null ){ return false; } if(pnode.left!=null){ queue1.offer(pnode.left); } if(pnode.right!= null){ queue1.offer(pnode.right); } if(qnode.left!=null){ queue2.offer(qnode.left); } if(qnode.right!= null){ queue2.offer(qnode.right); } } //跳出while()的情况是两个队列都为空,或者是有一个为空,一个而不为空,所以在这里要判断 if(queue1.isEmpty() && queue2.isEmpty()){ return true; }else{ return false; } } }
Over...