zoukankan      html  css  js  c++  java
  • 比较两个树是否相同

    题目:

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

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

  • 相关阅读:
    独立与条件独立
    独立事件、笛卡尔积与矩阵向量乘法
    独立事件、笛卡尔积与矩阵向量乘法
    OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
    等高线的认识
    等高线的认识
    概率相关的证明
    概率相关的证明
    OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
    中英文对照 —— 歌词
  • 原文地址:https://www.cnblogs.com/gjmhome/p/14372959.html
Copyright © 2011-2022 走看看