572. 另一棵树的子树

Problem: 572. 另一棵树的子树

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这个问题可以通过序列化树和KMP算法来解决。首先,我们将两棵树都序列化为一个字符串列表,然后使用KMP算法来检查第二棵树的序列化结果是否为第一棵树的子串。

解题方法

首先,我们定义一个序列化函数,将树的节点值按照前序遍历的顺序存储到一个列表中。对于空节点,我们将其表示为null。

然后,我们使用KMP算法来检查第二棵树的序列化结果是否为第一棵树的子串。KMP算法是一种高效的字符串匹配算法,它可以在O(n)的时间复杂度内完成匹配。

最后,我们返回KMP算法的结果,如果返回值不为-1,说明第二棵树是第一棵树的子树。

复杂度

时间复杂度:

O ( n + m ) O(n+m) O(n+m),其中n和m分别是两棵树的节点数。我们需要遍历两棵树的所有节点,并且在KMP算法中需要遍历两个字符串列表。

空间复杂度:

O ( n + m ) O(n+m) O(n+m),我们需要存储两棵树的序列化结果,以及KMP算法中的next数组。

Code

/*** 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 isSubtree(TreeNode t1, TreeNode t2) {if (t1 != null && t2 != null) {List<String> s1 = new ArrayList<>();List<String> s2 = new ArrayList<>();serial(t1, s1);serial(t2, s2);return kmp(s1, s2) != -1;}return t2 == null;}public int kmp(List<String> s1, List<String> s2) {int n = s1.size();int m = s2.size();int x = 0;int y = 0;int[] next = nextArray(s2, m);while (x < n && y < m) {if (isEquals(s1.get(x), s2.get(y))) {x++;y++;} else if (y == 0) {x++;} else {y = next[y];}}return y == m ? x - y : -1;}public int[] nextArray(List<String> s, int m) {if (m == 1) {return new int[] { -1 };}int[] next = new int[m];next[0] = -1;next[1] = 0;int i = 2, cn = 0;while (i < next.length) {if (isEquals(s.get(i - 1), s.get(cn))) {next[i++] = ++cn;} else if (cn > 0) {cn = next[cn];} else {next[i++] = 0;}}return next;}public void serial(TreeNode head, List<String> path) {if (head == null) {path.add(null);} else {path.add(String.valueOf(head.val));serial(head.left, path);serial(head.right, path);}}public boolean isEquals(String a, String b) {if (a == null && b == null) {return true;}if (a != null && b != null) {return a.equals(b);}return false;}
}

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

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

相关文章

【大模型】0.5B的大模型通义千问1.5-0.5B-Chat来了!!

【大模型】0.5B的大模型通义千问1.5-0.5B-Chat来了&#xff01;&#xff01; 模型介绍训练细节Requirements拉取模型示例代码多轮对话测试输出示例资源占用参考 模型介绍 Qwen1.5是Qwen2的测试版&#xff0c;这是一个基于转换器的纯解码器语言模型&#xff0c;在大量数据上进行…

快速实现Python/Flask静默获取微信公众号OpenID的完整指南及代码

初步简介 初始授权请求&#xff1a;用户访问 /api/wx_api/get_wx_openid 路由时&#xff0c;服务器端会生成一个微信授权URL&#xff0c;该URL指向微信的授权页面&#xff0c;并包含了必要的查询参数&#xff08;如appid、redirect_uri、response_type、scope、state&#xff0…

位运算(一)

位运算注意事项 整形在计算机中是以补码的形式进行存储的&#xff0c;因此位运算也是在补码的基础上进行操作的。 复习&#xff1a;正数&#xff1a;原码反码补码 负数&#xff1a;反码原码取反(除符号位) 补码反码1 位运算~&#xff1a;按位取反&#xff08;在补码上按位取…

Shellcode免杀对抗(Python)

Shellcode Python免杀&#xff0c;绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1&#xff1a; rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

代码随想录算法训练营第三十四天丨860.柠檬水找零、406. 根据身高重建队列、860. 柠檬水找零

860. 柠檬水找零 遇到顾客给20块的&#xff0c;优先拿10块的找给他。 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:change {5: 0, 10: 0}for bill in bills:if bill 5:change[5] 1elif bill 10:if change[5] < 1:return Falsechange[5] - …

目标检测算法之YOLOv5的应用实例(医疗影像辅助诊断领域应用的详解)

在医疗影像辅助诊断领域,YOLOv5可以被应用于快速而准确地识别和定位医学影像中的关键结构,比如肿瘤、器官或病变区域。这有助于医生更有效地分析影像资料,提高诊断的准确性和效率。以下是一个使用YOLOv5在医学影像上进行病灶检测的基本代码示例: import cv2 import torch …

Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

sqlserver 子查询 =,in ,any,some,all的用法

在 SQL Server 中&#xff0c;子查询常用于嵌套在主查询中的子句中&#xff0c;以便根据子查询的结果集来过滤主查询的结果&#xff0c;或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例&#xff1a; 使用 运算符进行子查询&a…

android11以上SD卡存储权限适配申请问题

在Android 11&#xff08;API级别30&#xff09;及以上版本中&#xff0c;应用需要获得MANAGE_EXTERNAL_STORAGE权限。这个权限允许应用访问设备上的所有文件&#xff0c;而不仅仅是它自己的文件。然而&#xff0c;由于这个权限对用户的隐私有潜在的影响&#xff0c;因此Google…

Java-String字符串的常见方法总结

常用方法 1.charAt(int index)方法和tocharArray()方法 charAt(int index)方法&#xff1a;括号里传入整型参数&#xff0c;可以获取到该下标位置的String数组内容&#xff0c;通常用于遍历字符串。 tocharArray()方法&#xff1a;将字符串转化为char类型&#xff0c;再存入c…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…

【NI-DAQmx入门】调整数据记录长度再进行数据处理

需要注意的是&#xff0c;初学者很容易造成一个大循环&#xff0c;导致采集循环的执行时间过长&#xff0c;最佳操作是采集循环只干采集的事&#xff0c;另起一个循环做数据拆解或分析。 有时需要以一定的采样率获取数据并记录所需的长度。然而&#xff0c;在处理这些数据时&am…

QT+OSG/osgEarth编译之八十八:osgdb_pic+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_pic)

文章目录 一、osgdb_pic介绍二、文件分析三、pro文件四、编译实践一、osgdb_pic介绍 PIC(Pixel Image Format)是一种用于存储和表示图像数据的文件格式。它最初由软件公司Softimage开发,用于存储计算机生成的图像和动画序列。 PIC格式使用无损压缩算法,可以保存包含颜色和…

2-17作业

#!/bin/bash read zifu case $zifu in [[:lower:]]) echo "小写字母" ;; [0-9]) echo "是数字字符" ;; [[:upper:]]) echo "是大写字母" ;; esac #!/bin/bash arr(ls ~) len${#arr…

每日OJ题_算法_递归⑤力扣50. Pow(x, n)

目录 力扣50. Pow(x, n) 解析代码 力扣50. Pow(x, n) 50. Pow(x, n) 难度 中等 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.0000…

把Activity当做dialog对话框使用

1、引言 在安卓开发中对话框的使用是不可避免的&#xff0c;但是原生的对话框用起来总感觉差点意思&#xff0c;而且位置不好控制&#xff0c;在与界面的交互上也不够灵活&#xff0c;没有像activity那样的生命周期方法&#xff0c;以至于某些特殊的功能无法实现。此时我们就希…

Android Studio新建EMPTY,提示Gradle下载失败,Connect timed out

Android Studio新建EMPTY&#xff0c;提示Gradle下载失败&#xff0c;Connect timed out 找到gradle-wrapper.properites文件&#xff0c;替换distributeionUrl为腾讯镜像&#xff0c;就好了&#xff0c;网上找了好久&#xff0c;就这个有效&#xff0c;是在这里Android导入项…

【分享】图解ADS+JLINK调试ARM

文章是对LPC2148而写的&#xff0c;但是对三星的44B0芯片同样适用&#xff0c;只需要在选择时将相应的CPU选择的S3C44B0就可以了。 JLINK在ADS下调试心得 前两天一个客户用jlink在ADS下调试LPC2148总报错&#xff0c;这个错误我之前在调试LPC2200的时候也碰到过&#xff0c;后…

ESP32学习(2)——点亮LED灯

1.前期准备 开发板原理图如下&#xff1a; 可见LED灯接在了GPIO2口 那么要如何编写代码控制GPIO口的电平高低呢&#xff1f; 我们可以参考micropython的官方文档Quick reference for the ESP32 — MicroPython latest documentation 可见&#xff0c;需要导入machine包 若要…