比较两个树是否相同

题目:

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

解题思路 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...

原文地址:https://www.cnblogs.com/gjmhome/p/14372959.html