相同的树[简单]

优质博文:IT-BLOG-CN

在这里插入图片描述

一、题目

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

示例 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

二、代码

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

/**
 * 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) {
   
        // 思想:递归遍历
        if (p == null && q == null) {
   
            return true;
        } else if (p == null || q == null) {
   
            return false;
        } else if (p.val == q.val) {
   
           return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }
        return false;
    }
}

时间复杂度: O(min⁡(m,n))其中mn分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。
**空间复杂度:O(min⁡(m,n))其中mn分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。

【2】广度优先搜索: 可以通过广度优先搜索判断两个二叉树是否相同。首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。使用两个队列分别存储两个二叉树的节点。初始时将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点,进行如下比较操作。
  ■ 比较两个节点的值,如果两个节点的值不相同则两个二叉树一定不同;
  ■ 如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;
  ■ 如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

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

/**
 * 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) {
   
        // 广度优先:需要两个队列:LinkedList
        if (p == null && q == null) {
   
            return true;
        } else if (p == null || q == null) {
   
            return false;
        }
        Queue<TreeNode> m = new LinkedList<TreeNode>();  // 存放 p 节点
        Queue<TreeNode> n = new LinkedList<TreeNode>();  // 存放 q 节点
        m.offer(p);
        n.offer(q);
        while(!m.isEmpty() && !n.isEmpty()) {
   
            TreeNode node1 = m.poll();
            TreeNode node2 = n.poll();
            // 不同返回 false,相同还需要看左右节点
            if (node1.val != node2.val) {
   
                return false;
            }

            // 获取平铺列表
            TreeNode left1 = node1.left;
            TreeNode right1 = node1.right;
            TreeNode left2 = node2.left;
            TreeNode right2 = node2.right;

            if (left1 == null ^ left2 == null) {
   
                return false;
            }
            if (right1 == null ^ right2 == null) {
   
                return false;
            }
            if (left1 != null) {
   
                m.offer(left1);
            }
            if (right1 != null) {
   
                m.offer(right1);
            }
            if (left2 != null) {
   
                n.offer(left2);
            }
            if (right2 != null) {
   
                n.offer(right2);
            }
        } 
        return m.isEmpty() && n.isEmpty();
    }
}

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

相关推荐

  1. leetcode-相同

    2024-02-05 22:26:02       67 阅读
  2. 100. 相同

    2024-02-05 22:26:02       51 阅读
  3. 100. 相同

    2024-02-05 22:26:02       43 阅读

最近更新

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

    2024-02-05 22:26:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 22:26:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 22:26:02       87 阅读
  4. Python语言-面向对象

    2024-02-05 22:26:02       96 阅读

热门阅读

  1. C++中的friend用法

    2024-02-05 22:26:02       48 阅读
  2. idea常用插件

    2024-02-05 22:26:02       48 阅读
  3. 数据合规:确保数据安全与隐私保护的关键

    2024-02-05 22:26:02       51 阅读
  4. Tomcat -- catalina.bat

    2024-02-05 22:26:02       47 阅读
  5. leetcode中二叉树迭代遍历中的三种遍历方式实现

    2024-02-05 22:26:02       60 阅读