leetcode100:相同的树

给你两棵二叉树的根节点 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

步骤1:问题定义与分析

问题性质

该问题是典型的二叉树递归判断问题,要求检验两棵二叉树是否在结构和节点值上完全相同。

输入输出条件
  1. 输入
    • 两棵二叉树的根节点 pq,它们可能为空,也可能有多达 100 个节点。
    • 每个节点的值范围在 [-10^4, 10^4]
  2. 输出
    • 如果两棵二叉树完全相同,返回 true;否则返回 false
限制与边界条件
  1. 边界条件
    • pq 同时为空,返回 true
    • 只有一棵树为空,返回 false
  2. 复杂度限制
    • 树的节点数最多为 100,因此即使采用递归方法,算法的时间复杂度应该控制在 O(n),空间复杂度(递归栈深度)在 O(h),其中 n 为树的节点数,h 为树的高度。

步骤2:解题思路分析与算法设计

解题分解步骤
  1. 递归判断两棵树的根节点
    • 如果根节点的值不相等,则两棵树不相同。
    • 如果根节点的值相等,则递归比较左子树和右子树是否相同。
  2. 终止条件
    • 两棵树的当前节点都为空时,返回 true(子树相同)。
    • 只有一棵树的当前节点为空时,返回 false(子树不同)。
  3. 递归子问题
    • 对于两棵树 pq,分别递归调用其左子树 p.leftq.left 以及右子树 p.rightq.right,并在递归过程中判断子树是否相同。
递归设计思路

采用深度优先搜索(DFS)进行递归判断,每次判断当前节点及其子节点是否一致。算法的逻辑简单且直观:

  1. 当前节点为空时返回结果;
  2. 判断当前节点值是否一致;
  3. 递归比较左子树和右子树。
算法复杂度
  • 时间复杂度:O(n),其中 n 为两棵树中节点数的最小值,每个节点访问一次。
  • 空间复杂度:O(h),其中 h 为递归调用栈的深度,最坏情况下(链式结构)为 O(n),平均情况下为 O(log n)。

步骤3:C++代码实现

步骤4:启发与优化

  1. 算法的优化性

    • 使用递归直接检查左右子树,保证算法清晰简洁。
    • 如果提前发现不相同的节点,立即终止递归,提升效率。
  2. 处理大规模数据的能力

    • 通过改用非递归的栈或队列实现(如广度优先搜索 BFS),可以在避免递归栈溢出的同时保持时间复杂度不变。

步骤5:实际应用场景

场景:文件夹结构比较

在文件系统中,文件夹可以用树结构表示,每个节点是文件或子文件夹。此算法可以用于比较两个文件夹是否完全相同:

  • 节点值表示文件名或文件大小。
  • 结构相同表示两个文件夹具有相同的目录层次。
实现示例
  1. 提取两个文件夹的树结构。
  2. 调用 isSameTree 函数判断结构和内容是否一致。
  3. 如果不一致,标记差异的节点。

这种方法在备份验证、文件同步系统中非常实用。

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

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

相关文章

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建…

如何在jupyter notebook切换python环境

目录 参考链接 首先确保conda已经正常安装 conda --version 或者conda -V 以下请将“myenv”替换成自己的命名&#xff01;&#xff01;&#xff01; 1-查看虚拟环境目录 conda env list 2-创建虚拟环境命令 conda create -n myenv 或者 conda create --name myenv 3-激活虚拟环…

【嵌入式软件-STM32】OLED显示屏+调试方法

目录 一、调试方式 1&#xff09;串口调试 优势 弊端 2&#xff09;显示屏调试 优势 弊端 3&#xff09;Keil调试模式 4&#xff09;点灯调试法 5&#xff09;注释调试法 6&#xff09;对照法 二、OLED简介 OLED组件 OLED显示屏 0.96寸OLED模块 OLED外观和种类…

求字符 ‘a‘ 和 ‘b‘ 组成的,最大长度为n的字符串中字典序第 k 个字符串

求字符 ‘a’ 和 ‘b’ 组成的&#xff0c;最大长度为n的字符串中字典序第 k 个字符串 先来解释一下这个题目&#xff0c;假设最大长度为3&#xff0c;那么由字符a和b组成的字符串有&#xff1a; a, b, ab, aaa, aba...把这些字符串按照字典序排序: aaaaaaaabababaabbbbabaab…

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

如何保证MySQL与Redis缓存的数据一致性?

文章目录 一、引言二、场景来源三、高并发解决方案1. 先更新缓存&#xff0c;再更新数据库2. 先更新数据库&#xff0c;再更新缓存3. 先删除缓存&#xff0c;再更新数据库4. 先更新数据库&#xff0c;再删除缓存小结 四、拓展方案1. 分布式锁与分布式事务2. 消息队列3. 监听bin…

暴露IP地址会影响网络隐私安全吗?

​我的IP地址暴露后会影响隐私安全吗&#xff1f; 互联网飞速发展以来&#xff0c;短短数十年&#xff0c;我们的工作生活就不能够离开互联网。那么作为网络连接传递数据的门户——IP地址&#xff0c;大家都有一定的疑惑和好奇。其中关于自身安全的尤为重要&#xff0c;所以IP…

通过 SSH 隧道将本地端口转发到远程主机

由于服务器防火墙,只开放了22端口,想要通过5901访问服务器上的远程桌面,可以通过下面的方式进行隧道转发。 一、示例命令 这条代码的作用是通过 SSH 创建一个 本地端口转发,将你本地的端口(5901)通过加密的 SSH 隧道连接到远程服务器上的端口(5901)。这种方式通常用于在…

CTF攻防世界小白刷题自学笔记14

fileclude&#xff0c;难度&#xff1a;1&#xff0c;方向&#xff1a;Web 题目来源:CTF 题目描述:好多file呀&#xff01; 给一下题目链接&#xff1a;攻防世界Web方向新手模式第17题。 打开一看&#xff0c;这熟悉的味道&#xff0c;跟上一篇文章基本一摸一样的&#xff…

微信小程序开发,仿小红书瀑布流实现

文章目录 1. 涉及到的知识点2. 功能描述3. 通用属性3. 代码实现过程4. 报错问题&#xff0c;解决方法5. 运行效果图 1. 涉及到的知识点 grid-view的使用官方文档指南&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/grid-view.html 2. 功能描述 Sk…

ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;“魅力”繁峙宣传网站系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了“魅力”繁峙宣传网站系统的发展&#x…

基于Matlab的碎纸片的自动拼接复原技术

碎纸片的自动拼接复原技术 摘要&#xff1a;破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。目前发现对碎纸片的拼接大部分由人工完成&#xff0c;准确率较高&#xff0c;但耗费大量人力财力及时间&#xff0c;效率很低。随着计算机技术的…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

【C#】CS0246: 未能找到类型或命名空间名“MySql”

前言 在学习C#,一定要学会了使用NuGet,以后包问题都可以通过此方法解决。望大家不加班~ 问题描述 项目 visual studio 2022 .NETFramework,Version=v4.8错误 CS0246: 未能找到类型或命名空间名“MySql”问题 CS0246 错误表示编译器无法在当前项目中找到名为“MySql”的…

通过Python 调整Excel行高、列宽

在Excel中&#xff0c;默认的行高和列宽可能不足以完全显示某些单元格中的内容&#xff0c;特别是当内容较长时。通过调整行高和列宽&#xff0c;可以确保所有数据都能完整显示&#xff0c;避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业&#xff0c;尤其是在…

如何用Java爬虫“采集”商品订单详情的编程旅程

在这个数据驱动的世界里&#xff0c;如果你不是数据&#xff0c;那么你一定是在收集数据。就像蜜蜂采集花粉一样&#xff0c;我们程序员也需要采集数据&#xff0c;以便分析、优化和做出明智的决策。今天&#xff0c;我们就来聊聊如何使用Java编写一个爬虫&#xff0c;这个爬虫…

执行flink sql连接clickhouse库

手把手教学&#xff0c;flink connector打通clickhouse大数据库&#xff0c;通过下发flink sql&#xff0c;来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器&#xff0c;工作中难免会用到。 2.方案 利用GitHub大佬提供…

Python数据分析NumPy和pandas(三十二、数据拆分-应用-合并)

最常用的 GroupBy 方法是 apply&#xff0c;apply 将正在操作的对象拆分为多个片段&#xff0c;在每个片段上调用传递给它函数&#xff0c;然后尝试连接这些片段。 还是用前面的小费数据集tips.csv&#xff0c;它的内容如下图&#xff1a; 假设我们想按smoker进行分组并选择前…

【C++】字符串相乘

1.题目 2.代码 介绍一种比较简单的方法&#xff0c;就是先将字符串逆序&#xff0c;然后取出其中每一位的数相乘、相加。最后再考虑进位问题。 class Solution { public:string multiply(string num1, string num2) {//先排除边界情况&#xff0c;防止输出"00000...&quo…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架&#xff0c;用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分&#xff0c;提供了全面的安全解决方案&#xff0c;包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 &#xff08;1&am…