子结构判断

news/2025/10/1 23:49:03/文章来源:https://www.cnblogs.com/Lantz12/p/19123082

子结构判断

LCR 143. 子结构判断

参考题解

题前知识

1)子结构

首先我们先了解一下子结构:

  • 原题信息:判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值
  • 子结构也就是B树是否含于A树左子树或者右子树之中,并且具有相同的结构和节点值,或者是否以A树的根节点作为子树

2)先序遍历

该题使用到了先序遍历,先序遍历相关代码

先序遍历规则:根左右

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();dfs(res, root);return res;
}
private void dfs(List<Integer> res, TreeNode root){if(root == null){return;}res.add(root.val);dfs(res, root.left);dfs(res, root.right);}

正题

我们可以使用先序遍历A的每个节点,然后我们判断A树是否包含B

由于我们判断A树是否包含B树是从根节点开始匹配的,所以先序遍历的更合适本题

判断A树是否包含B

终止条件

  • B为空,说明B已经匹配完成,返回true;
  • A为空,匹配失败,B树已经越过了A的叶子结点,超出范围了,返回false;
  • A的节点值和B的节点值不一样,返回false

返回条件

  • 判断A的左节点是否和B的左节点相等 –> recur(A.left, B.left)
  • 判断A的右节点是否和B的右节点相等 –> recur(A.right, B.right)
public boolean recur(TreeNode A, TreeNode B) {if(B == null) return true;if(A == null || A.val != B.val) return false;return recur(A.left, B.left) && recur(A.right, B.right);
}

isSubStructure(A, B)函数

边界条件

  • A树或者B树为null,返回false

三种情况

  • A的根节点为子树包含B
  • A的左子树为子树包含B
  • A的右子树为子树包含B

以上情况只要符合一种就返回true

最终代码:

通过recur(A, B)找到B的根节点和B的子节点是否和A的匹配

public boolean isSubStructure(TreeNode A, TreeNode B) {return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}public boolean recur(TreeNode A, TreeNode B) {if(B == null) return true;if(A == null || A.val != B.val) return false;return recur(A.left, B.left) && recur(A.right, B.right);
}

题后解析

关于题中用到的先序遍历思想

1、isSubStructure(A, B)中的先序遍历

对于树A的某个节点:

  1. 先访问根节点:执行 recur(A, B) 检查当前节点是否能作为匹配的起点
  2. 再遍历左子树:如果根节点不匹配,递归调用 isSubStructure(A.left, B)
  3. 最后遍历右子树:如果左子树也没有找到,递归调用 isSubStructure(A.right, B)

2、recur 方法中的先序遍历

  • 先比较当前根节点的值 (A.val != B.val)
  • 再递归比较左子树 (recur(A.left, B.left))
  • 最后递归比较右子树 (recur(A.right, B.right))

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

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

相关文章

使用 Go 进行验证码识别

Go 语言也可以与 Tesseract OCR 配合使用来识别验证码。我们将使用 go-tesseract 这个库来进行 OCR 操作。安装 Tesseract OCR首先,你需要确保你已经安装了 Tesseract OCR。你可以通过以下命令在 Linux 和 macOS 上安…

使用 Rust 进行验证码识别

Rust 是一种高效且内存安全的语言,适用于需要高性能的应用场景。虽然 Rust 的生态相较于 Python 和 Go 可能稍逊一筹,但我们依然可以通过使用适配 Tesseract OCR 的 Rust 库来实现验证码识别。安装 Tesseract OCR首先…

花卉网站建设策划书正规男科医院

文章目录 1. MyBatis的常用注解2. 基于注解的MyBatis增删改查增删改查完整代码加载映射关系测试代码 3. MyBatis的注解实现复杂映射开发一对一操作的实现一对一操作实现的第二种方式一对多操作的实现多对多操作实现 1. MyBatis的常用注解 2. 基于注解的MyBatis增删改查 使用注…

使用 Swift 进行验证码识别

与其他语言一样,我们可以使用 Tesseract OCR 来进行验证码识别。Swift 通过 TesseractOCR 库提供了与 Tesseract 的集成。安装 Tesseract OCR首先,你需要确保你已经安装了 Tesseract OCR。你可以使用 Homebrew 在 ma…

好听的网站名称什么是建设型的网站

说到ARM A72和A73 就不得不说一个事&#xff0c;A73相比A72并不是一个简单的升级&#xff0c;A72和A73不是同一个团队做的。A73其实有点像当初的A17&#xff0c;整体微架构、流水线、宽度设计都与之类似。A73和A72相比没有保留A72的三发射&#xff0c;改用了双发射。ARM的宣传A…

Python错题集

( Python 3.9)停止了对Windows 7 的支持。创建一个新Python文件的方法是(使用IDLE的“New File”命令)。在Python中,("**"命令符)用于获取一个数的幂。() 在Python中,%运算符只能用于整数之间地取模…

中国社交网站做多外国人的做淘宝导购网站

laravel 事件队列 使用案例讲解分析 场景:出发事件&#xff0c;在监听事件的监听器内引入队列机制&#xff0c;异步处理监听事件对应的业务 定义事件&#xff1a;目录app/Events(路径没有就手动建)下 新建文件DeomEvent.php <?phpnamespace App\Events;use Illuminate\B…

建设工程造价员网站温州网站网络公司

早就听说Ajax技术了&#xff0c;传说中是一种很牛的东西&#xff0c;号称无刷新&#xff0c;其实是在web上通过javascript&#xff0c;使用异步的xmlhttp请求&#xff0c;实现无刷新的web界面。可惜一直没有体验过&#xff0c; 先后听做PHP的朋友用过PHP的Ajax开发包&#xff0…

火狐浏览器新页覆盖旧页解决方法

1、在浏览器顶部的地址栏中,输入 “about:config”(注意英文冒号和小写格式),输入完成后按下回车键。 2、在配置页面顶部的搜索栏中,输入 “browser.tabs.loadBookmarksInTabs”,系统会自动筛选出对应的参数选项…

seo是对网站进行什么优化app开发运营需要多少钱

RS485是常见的串口接口。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 串口、UART、TTL、RS232、RS422、RS485的关系 1.1 串口 1.2 UART、TTL、RS232、RS422、RS485 1.3 常见串口标准的比较 …

网站配色方案 对比色做网站营销怎么去推广

嵌入式开发主要包括单片机(MCU)开发和以 ARM 为代表的嵌入式 Linux 开发。本文主要讲解单片机开发中嵌入式软件架构的演进,包括从最初的简单轮询式架构,到前后台系统,再到如今复杂多样的实时操作系统(RTOS)。对比各种嵌入式软件架构的特点和差异,并讨论学习 RTOS 的必要…

msi主板,windows11,mbr转gpt后,提示0xc000000e1,无法进入系统

msi主板设置为纯uefi启动 常规的修复引导了无数次,总是提示0xc000000e1错误第一个是我的系统的固态,设置为启动项!下面有个UEFI硬盘BBS优先权 在这里面设置启动硬盘,这里面有2个,有一个是有效的,据AI解释是2种启…

MAUI下热重载不生效

看看有无<PropertyGroup Condition="$(Configuration) == Debug"><_MauiForceXamlCForDebug>true</_MauiForceXamlCForDebug></PropertyGroup>删除即可作者:猫叔Vincent 本文版权归…

我想学网站建设需要选择什么书找人做网站注意事项

将自己源码安装的软件加入到系统服务中。例如nginx,mysql 就以nginx为例&#xff0c;源码安装&#xff0c;加入到系统服务中 使用yum安装nginx&#xff0c;自动会加入到系统服务 16-Linux系统服务 - 刘清政 - 博客园 (cnblogs.com) 第一步: 源码安装好nginx之后&#xff0…

网站建设与设计实验报告公司做的网站访问很慢

题目 NOI / 1.5编程基础之循环控制-25:求特殊自然数 题解 首先&#xff0c;不可能无限穷举 范围限定&#xff1a;七进制与九进制表示都是三位数 最大&#xff1a;888(9) 728(10) 最小&#xff1a;100(7) 49(10) 然后就是十进制转x进制的问题 n对xa取模&#xff0c;就是对应…

US$138 D80D0WQ Eraser/Programmer

D80D0WQ ERASER/Programmer D80D0WQ Programmer Functions:Read,program,erase incremental registers\EEPROMErase time 5-10 minutesSupported both clock rates 4.0 and 8.0 MHz ICs.On-board EEPROM programmingSe…

直播网站app开发火速网站建设

目录 0、CSS介绍 1、CSS语句组成 2、CSS选择器的选择方式 1&#xff09;CSS选择器的方式和选择器大全&#xff1a; 2&#xff09;常见的三种方式&#xff1a; 3、添加CSS方式 1&#xff09;外部样式表 html调用css代码 css文件 html文件 展示 2&#xff09;内部样式表…

台州椒江区热销企业网站搭建网站建设中的矢量图标

Android 开放性配件协议&#xff08;AOA&#xff09; Android 开放性配件协议&#xff08;AOA&#xff09;支持允许外部 USB 硬件&#xff08;Android USB 配件&#xff09;与工作在配件模式下的 Android 设备进行交互。当处于配件模式的 Android 设备被供电&#xff0c;所连接…

网站建设网站推广服务公司深圳百度代理

http://blog.csdn.net/sm9sun/article/details/53519226 我们都知道&#xff0c;算法即解决问题的方法&#xff0c;我们衡量一个算法的优劣&#xff0c;可以用空间复杂度与时间复杂度来衡量。 换做我们实际生活中&#xff0c;就是物质成本开销与时间成本开销。 不同算法进行泡妞…