力扣100 相同的数(两种解法)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1:

在这里插入图片描述

输入:p = [1,2,3], q = [1,2,3] 输出:true 示例 2:
在这里插入图片描述

输入:p = [1,2], q = [1,null,2] 输出:false 示例 3:
在这里插入图片描述

输入:p = [1,2,1], q = [1,1,2] 输出:false

提示:

两棵树上的节点数目都在范围 [0, 100] 内
-104 <= Node.val <= 104

方法一:深度优先搜索

如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   
    public boolean isSameTree(TreeNode p, TreeNode q) {
   
    	 //如果p和q同时为空则返回true
         if(p == null && q == null) return true;
         //p和q其中一个不为空则返回false 
         if(p == null || q == null) return false;
         //p和q的值不相等返回false
         if(p.val != q.val) return false;
         //判断左子树和右子树是否完全相等
         return  isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
   }
}

复杂度分析

时间复杂度:O(min⁡(m,n))O(\min(m,n))O(min(m,n)),其中 mmm 和 nnn
分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。

空间复杂度:O(min⁡(m,n))O(\min(m,n))O(min(m,n)),其中 mmm 和 nnn
分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。

方法二:广度优先搜索

也可以通过广度优先搜索判断两个二叉树是否相同。同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。

使用两个队列分别存储两个二叉树的节点。初始时将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点,进行如下比较操作。

比较两个节点的值,如果两个节点的值不相同则两个二叉树一定不同;

如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;

如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

如果搜索结束时两个队列同时为空,则两个二叉树相同。如果只有一个队列为空,则两个二叉树的结构不同,因此两个二叉树不同。

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<TreeNode>();
        Queue<TreeNode> queue2 = new LinkedList<TreeNode>();
        queue1.offer(p);
        queue2.offer(q);
        while (!queue1.isEmpty() && !queue2.isEmpty()) {
   
            TreeNode node1 = queue1.poll();
            TreeNode node2 = queue2.poll();
            if (node1.val != node2.val) {
   
                return false;
            }
            TreeNode left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;
            if (left1 == null ^ left2 == null) {
   
                return false;
            }
            if (right1 == null ^ right2 == null) {
   
                return false;
            }
            if (left1 != null) {
   
                queue1.offer(left1);
            }
            if (right1 != null) {
   
                queue1.offer(right1);
            }
            if (left2 != null) {
   
                queue2.offer(left2);
            }
            if (right2 != null) {
   
                queue2.offer(right2);
            }
        }
        return queue1.isEmpty() && queue2.isEmpty();
    }
}

相关推荐

  1. 100】2.相加

    2023-12-06 20:32:05       73 阅读
  2. top100-之和

    2023-12-06 20:32:05       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 20:32:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 20:32:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 20:32:05       82 阅读
  4. Python语言-面向对象

    2023-12-06 20:32:05       91 阅读

热门阅读

  1. MySQL - 多表查询

    2023-12-06 20:32:05       64 阅读
  2. 网页开发 HTML

    2023-12-06 20:32:05       61 阅读
  3. CentOS7.5安装zookeeper3.9.1详细步骤

    2023-12-06 20:32:05       61 阅读
  4. WordPress插件无法安装一直失败的原因和解决办法

    2023-12-06 20:32:05       53 阅读
  5. IPv4/IPv6 组播对应的MAC地址

    2023-12-06 20:32:05       50 阅读
  6. IDEA-快捷键大全

    2023-12-06 20:32:05       47 阅读
  7. sql常用语法练习

    2023-12-06 20:32:05       59 阅读
  8. Linux 离线安装NFS共享文件

    2023-12-06 20:32:05       56 阅读
  9. nodejs接收前端分片并组合成完整文件

    2023-12-06 20:32:05       56 阅读