二叉树题目:相同的树

news2024/11/16 17:29:34

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:相同的树

出处:100. 相同的树

难度

3 级

题目描述

要求

给你两个二叉树的根结点 p \texttt{p} p q \texttt{q} q,编写一个函数来检验这两个树是否相同。

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

示例

示例 1:

示例 1

输入: p   =   [1,2,3],   q   =   [1,2,3] \texttt{p = [1,2,3], q = [1,2,3]} p = [1,2,3], q = [1,2,3]
输出: true \texttt{true} true

示例 2:

示例 2

输入: p   =   [1,2],   q   =   [1,null,2] \texttt{p = [1,2], q = [1,null,2]} p = [1,2], q = [1,null,2]
输出: false \texttt{false} false

示例 3:

示例 3

输入: p   =   [1,2,1],   q   =   [1,1,2] \texttt{p = [1,2,1], q = [1,1,2]} p = [1,2,1], q = [1,1,2]
输出: false \texttt{false} false

数据范围

  • 两个树中的结点数目都在范围 [0,   100] \texttt{[0, 100]} [0, 100]
  • -10 4 ≤ Node.val ≤ 10 4 \texttt{-10}^\texttt{4} \le \texttt{Node.val} \le \texttt{10}^\texttt{4} -104Node.val104

解法一

思路和算法

两个二叉树相同等价于两个二叉树的结构相同且相同位置的结点值相同。可以同时遍历两个二叉树,判断两个二叉树是否相同。

深度优先搜索的做法是,首先判断两个二叉树是否为空,如果两个二叉树都为空则两个二叉树相同,如果两个二叉树中只有一个为空则两个二叉树不同。

当两个二叉树都不为空时,可以递归判断两个二叉树是否相同。需要判断两个二叉树的根结点值是否相同、两个二叉树的左子树是否相同、两个二叉树的右子树是否相同,对左子树和右子树的判断使用递归的方式。只有当根结点、左子树和右子树都相同时,两个二叉树才相同。

代码

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

复杂度分析

  • 时间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。同时遍历两个二叉树,只有当两个二叉树在相同位置的结点都不为空时才会访问该位置的结点,因此访问的结点数不超过较小的二叉树的结点数。

  • 空间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是递归调用的栈空间,栈空间不超过较小的二叉树的高度,最坏情况下二叉树的高度和结点数相等。

解法二

思路和算法

也可以使用广度优先搜索遍历两个二叉树,判断两个二叉树是否相同。

使用两个队列分别存储两个二叉树的结点,同时遍历两个二叉树。初始时将两个二叉树的根结点分别入两个队列,遍历过程中,每次从两个队列分别将一个结点出队列,这两个出队列的结点一定是两个二叉树中的相同位置的结点,执行如下操作。

  1. 如果两个结点值不同,则两个二叉树的相同位置处的结点值不同,因此两个二叉树不同。

  2. 如果两个结点值相同,则分别获得两个结点的左子结点和右子结点,如果两个左子结点恰好有一个为空,或者两个右子结点恰好有一个为空,则两个二叉树的结构不同,因此两个二叉树不同。

  3. 如果两个结点的左子结点和右子结点的结构相同,则将的非空左子结点和右子结点分别入相应的队列。

当队列为空时,遍历结束,如果在任意位置,两个二叉树的结构都相同且结点值都相同,则两个二叉树相同。

代码

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        Queue<TreeNode> queue1 = new ArrayDeque<TreeNode>();
        Queue<TreeNode> queue2 = new ArrayDeque<TreeNode>();
        queue1.offer(p);
        queue2.offer(q);
        while (!queue1.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);
                queue2.offer(left2);
            }
            if (right1 != null) {
                queue1.offer(right1);
                queue2.offer(right2);
            }
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。同时遍历两个二叉树,只有当两个二叉树在相同位置的结点都不为空时才会访问该位置的结点,因此访问的结点数不超过较小的二叉树的结点数。

  • 空间复杂度: O ( min ⁡ ( m , n ) ) O(\min(m, n)) O(min(m,n)),其中 m m m n n n 分别是两个二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过较小的二叉树的结点数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振动在线监测:如何优化您的设备维护计划?

在工业生产中&#xff0c;设备的维护计划对于确保设备可靠性和生产效率至关重要。而振动在线监测作为一种先进的技术手段&#xff0c;可以实时监测设备振动情况&#xff0c;帮助企业优化维护计划&#xff0c;提高设备维护效率。本文将介绍振动在线监测的重要性&#xff0c;并分…

SparkSQL的分布式执行引擎(Spark ThriftServer)

文章目录 1.Spark ThriftServer2.启动 Spark ThriftServer3.Beeline方式连接4.DataGrip方式连接5. 代码方式6. SparkSQL运行方式7.参考文章 1.Spark ThriftServer Spark ThriftServer 相当于一个持续性的Spark on Hive集成模式&#xff0c;可以启动并监听在10000端口&#xff…

182_Power BI 使用 DAX 按照先进先出原则计算毛利润

182_Power BI 使用 DAX 按照先进先出原则计算毛利润 一、背景 在笔者以往的文章中也有先进先出的案例&#xff0c;可以参考(https://jiaopengzi.com/?s%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA)。 今天我们来看一个网友提出的问题&#xff0c; 先进先出的原则&#xff0c;入…

ATM模拟机-实战开发-前期准备

需求分析 项目名称&#xff1a;ATM模拟存取钱系统 目录 需求分析 项目名称&#xff1a;ATM模拟存取钱系统 项目目标功能分析&#xff1a; 用户功能&#xff1a; 提供功能 基本功能 管理员功能&#xff1a; 提供功能 基本功能 详细分析 用户功能 管理员功能 用户…

ModaHub大禹智库:ModelScope魔搭社区的“下载数据严重造假“的说法可能存在一定的合理性

目录 首先&#xff0c;我们需要了解ModelScope魔搭社区的运营模式和数据收集方式。 其次&#xff0c;我们需要考虑ModelScope魔搭社区的用户群体和应用场景。 此外&#xff0c;我们还需要考虑ModelScope魔搭社区的发展时间和市场竞争情况。 综上所述&#xff0c;ModelScope…

PHP反序列化漏洞之Phar

目录 1、认识phar类型文件 2、制作phar文件 3、phar的上传与读取 4、漏洞利用的条件 1、认识phar类型文件 这种文件可以通过phar协议来读取&#xff08;使用phar://后面接文件路径即可读取&#xff09; 先给大家看一下phar文件的大致样子&#xff1a; 它一般包括头部信息&…

Windows10下使用wsl2+ubuntu1804

一定好好看官方文档 适用于 Linux 的 Windows 子系统文档 | Microsoft Learn 一、安装WSL 1.1、方式一&#xff1a; 现在&#xff0c;可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符&#xff0c;方法是右键单击并选择…

OpenAI Gym入门与实操(3)

接前一篇文章&#xff1a;OpenAI Gym入门与实操&#xff08;2&#xff09; 本文内容参考&#xff1a; Getting Started With OpenAI Gym | Paperspace Blog&#xff0c; 【强化学习】 OpenAI Gym入门&#xff1a;基础组件&#xff08;Getting Started With OpenAI Gym: The B…

leetcode 989.数组形式的整数加法

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a; 数组形式的整数加法 ⭕️ 代码&#xff1a; /*思路&#xff1a;数组从后往前和k的低位相加&#xff0c;若大于等于10则进一.[1 , 2 , 0 , 0] 3 44 3 2 1 最后逆置数组即可。 */ int* addToArrayForm(…

【进程】快速上手进程操作

目录 0. 进程概述 1. 创建进程 1.1 进程的创建&#xff1a;fork函数 1.2 进程的等待&#xff1a;wait()、waitpid() 1.3 特殊进程&#xff1a;僵尸进程、孤儿进程、守护进程 1.4 进程的终止&#xff1a;exit和_exit函数 1.5 进程退出清理&#xff1a;atexit函数 1.6 进…

自动部署代码导致接口访问404

问题原因&#xff1a;.user.ini文件中open_basedir与线上服务器中不同导致 由于.user.ini文件特殊性质 需要修改其中文件需要root权限也无法完成 推荐文章(linux系统中文件有哪些隐藏属性_帮助中心_文汇软件_山东文汇信息【官方网站】) 即可解决

【elementplus】body设置zoom后,el-table开启show-overflow-tooltip后,表格的tooltip显示会错位的解决方案

由于我的项目是无法避免使用zoom&#xff0c;所以只记录zoom后的解决方案 示例&#xff1a;明明划过的是第一行&#xff0c;tooltip却显示到了第四行的位置&#xff1b; 正确显示&#xff1a;划过第一行&#xff0c;tooltip显示在第一行的位置 代码&#xff1a;使用transfor…

关于 Asyncio,别再使用run_until_complete了

熟悉Python 的 Asyncio 进行异步编程的小伙伴肯定对下面的写法不陌生&#xff1a; import asyncioasync def test():await asyncio.sleep(3)print("Test rersult")loop asyncio.get_event_loop() loop.run_until_complete(test())这种写法也是在网上搜到的最多的协…

VUE小白学习-官方网站资料学习-2023年5月22日

VUE小白学习-官方网站资料学习-2023年5月22日 VUE干啥的&#xff1f;单文件组件&#xff1f;官方说&#xff0c;VUE前端万金油。 日期&#xff1a;2023年5月22日 VUE干啥的&#xff1f; 是一个前端框架&#xff0c;有自己的一套规则&#xff0c;方便前端开发。 单文件组件&am…

企业微信扫码登陆-详细案例

以下是实现的pc端企微扫码登陆&#xff0c;话不多时&#xff0c;直接上代码。。。 第1步&#xff1a;企业微信自建应用 第二步&#xff1a;获取到之后拿到 整体流程&#xff1a; 1.企业发起授权登录请求&#xff0c;企业微信用户允许授权后&#xff0c;企业微信会重定向到企业…

Windows基于WSL搭建Python数据分析环境

最近配置了一台较为不错的台式机&#xff0c;记录下自己配置环境的过程。 安装WSL&#xff0c;提供Linux环境 如果你发现后续的命令无法运行或者说软件商城中找不到&#xff0c;这可能意味着你的操作系统不符合要求。WSL安装要求 Windows 10 version 2004&#xff08;Build 19…

C++之H数回信

void H数(int 数) {int Lin 数;while (Lin>1){if (!(Lin % 2) || !(Lin % 3) || !(Lin % 5) || !(Lin % 7)){if (!(Lin % 2))Lin / 2;else if (!(Lin % 3))Lin / 3;else if (!(Lin % 5))Lin / 5;else if (!(Lin % 7))Lin / 7;}else return;}cout << 数 << ends…

Proxmox 8.0 “Virtual Environment”发布

导读Proxmox发布新产品Proxmox VE8.0&#xff0c;基于Debian 12.该版本集成了新的Linux内核6.2、QEMU 8.0.2、LXC 5.0.2和OpenZFS 2.1.12&#xff0c;并且还有其他一些新功能和改进。 更新的部分包括更新的Ceph服务器、安装程序ISO增加基于文本的用户界面、整合主机网络桥和VN…

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056

STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统DS1302万年历时钟秒表控制系统-0056 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器多个按键DS1302北京时间 1.单片机程序使…

java 分布式事务seata的使用

首先创建一个seata的springboot模块并引入seata的起步依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>模块的目录结构如下 seata.yaml中的内容为&…