java数据结构与算法刷题-----LeetCode572. 另一棵树的子树(经典题,树字符串化KMP)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 暴力求解,深度优先
    • 2. KMP算法进行串匹配

在这里插入图片描述

1. 暴力求解,深度优先

解题思路:时间复杂度O(s*t)其中s是树的结点个数,t是子树的结点个数。空间复杂度O(max(ds,dt))其中ds是树的深度,dt是子树的深度
  1. 我们先对整个树深度优先遍历
  2. 每个结点都与子树的根节点进行比对
  3. 如果对上了,就以当前结点为根节点,进行和子树的深度优先遍历,看看是否一一对应
  4. 对应上就返回true,没对应上就继续深度优先遍历。直到整个树遍历完成
代码

在这里插入图片描述

class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root == null && subRoot == null) return true;//如果都为null,就无需找子树了else if(root == null || subRoot == null) return false;//如果有一个为null,另一个不是null,肯定不是子树//先进行深度优先遍历,直接比对当前结点,如果能对上就可以省下很多时间//遍历到底时,再去isSameTree方法中,判断以当前root为根的子树,是否和subRoot是一样的else return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot)||isSameTree(root,subRoot);}//深度优先判断是否是相同的树public boolean isSameTree(TreeNode root,TreeNode subRoot){if(root == null && subRoot == null) return true;if(root == null || subRoot == null) return false;if(root.val == subRoot.val){return isSameTree(root.left,subRoot.left) && isSameTree(root.right,subRoot.right);}return false;}
}

2. KMP算法进行串匹配

KMP算法https://blog.csdn.net/grd_java/article/details/136107363
解题思路:时间复杂度O(s+t),空间复杂度O(s+t)
  1. 生成两颗树的遍历序列,以类似如下的形式:(下面形式是广度(层序)遍历序列,需要额外空间辅助,所以我们放弃)
    在这里插入图片描述
  2. 为了效率和更少的空间,我们使用广度优先遍历。那么就需要两个不同的值,来表示某结点左子树为空,和右子树为空的情况。
  3. 同样为了效率,我们不使用字符串比较,选用int型容器,比如int型的链表来生成匹配串
  4. 那么null如何来表示呢?
  1. 我们可以规定两个值,来分别表示左子树为null和右子树为null的情况
  2. 这里我选择先找到树中最大值max,然后令max+1表示左子树为空情况,max+2表示右子树为空情况
  1. 生成两颗树的匹配串后,让大树作为主字符串,要匹配的子树作为要匹配的子串,改编KMP算法,如果匹配成功,说明树中可以匹配到子树
代码:leetcode的特色之一就是,更优的算法,有时因为使用程序自带的特殊容器(比如Java中的List),因为这些容器初始化比较耗时间,反而耗时更高。但是实际工作场景,一旦数据量起来,肯定是这个算法优于上面的暴力解法的。

在这里插入图片描述

class Solution {List<Integer> sOrder = new ArrayList<Integer>();//用来保存s树的遍历结果,主串List<Integer> tOrder = new ArrayList<Integer>();//保存t树,匹配串int maxElement, lNull, rNull;//maxElement保存两颗树中最大值,lNull为左子树为空的标记,rNull为右子树为空//此方法获取树中最大值,深度优先public void getMaxElement(TreeNode t) {if (t == null) return;maxElement = Math.max(maxElement, t.val);getMaxElement(t.left);getMaxElement(t.right);}//此方法生成树的遍历字符串,其中,左右子树为null的,使用lNull和rNull填充public void getDfsOrder(TreeNode t, List<Integer> tar) {if (t == null) return;tar.add(t.val);//填充当前值//如果左子树为null填充lNull,否则继续遍历左子树if (t.left != null) getDfsOrder(t.left, tar);else tar.add(lNull);//右子树不为null继续遍历右子树,否则填充rNullif (t.right != null) getDfsOrder(t.right, tar);else tar.add(rNull);}//入口方法,1.获取树最大值max,并令max+1作为lNull,max+2作为rNull//2. 获取两颗树的遍历串。 3. kmp算法进行匹配public boolean isSubtree(TreeNode s, TreeNode t) {maxElement = Integer.MIN_VALUE;//获取两颗树中的最大值getMaxElement(s);getMaxElement(t);//则最大值+1和+2是树中绝对不存在的两个值lNull = maxElement + 1;//最大值+1作为左子树为空的填充串rNull = maxElement + 2;//最大值+2为右子树为空//获取两颗树的遍历串getDfsOrder(s, sOrder);getDfsOrder(t, tOrder);//通过kmp算法return kmp();}//kmp算法,如果匹配到子串,说明树中可以匹配到t这颗子树public boolean kmp() {int sLen = sOrder.size(), tLen = tOrder.size();int[] fail = new int[tOrder.size()];fail[0] = 0;for (int i = 1, j = 0; i < tLen; ++i) {while (j > 0 && !(tOrder.get(i).equals(tOrder.get(j)))) j = fail[j-1];if (tOrder.get(i).equals(tOrder.get(j))) ++j;fail[i] = j;}for (int i = 0, j = 0; i < sLen; ++i) {while (j > 0 && !(sOrder.get(i).equals(tOrder.get(j)))) j = fail[j-1];if (sOrder.get(i).equals(tOrder.get(j))) ++j;if (j == tLen) return true;}return false;}
}

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

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

相关文章

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…

mysql学习--binlog与gtid主从同步

基础环境 基于centOS7-MySQL8.0.35版本 我们先准备一台主服务器两台从服务器来实现我们主从同步的诉求 Master&#xff1a;192.168.75.142 slave1:192.168.75.143 slave&#xff1a;192.168.75.145 binlog主从同步 主库配置 #我们需要在主从库中都需要添加server_id&am…

大龙谈智能内容开通视频号啦

大家好&#xff0c;大龙谈只能内容开通视频号了&#xff0c;欢迎大家扫码关注&#xff1a;

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

RocketMQ安装

mq服务端安装配置启动把windows做成服务 mq管理界面安装配置启动 mq服务端 安装 RocketMQ下载地址 配置 ROCKETMQ_HOME D:\google-d\rocketmq-all-5.2.0-bin-release启动 # bin目录cmd输入 start mqnamesrv.cmd把windows做成服务 http://t.csdnimg.cn/qd2RD mq管理界面 …

ubuntu22.04安裝mysql8.0

官网下载mysql&#xff1a;MySQL :: Download MySQL Community Server 将mysql-server_8.0.20-2ubuntu20.04_amd64.deb-bundle.tar上传到/usr/local/src #解压压缩文件 tar -xvf mysql-server_8.0.20-2ubuntu20.04_amd64.deb-bundle.tar解压依赖包依次输入命令 sudo dpkg -i m…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…

自定义BeanNameGenerator生成规则

通过点进ComponentScan注解进入源码可以看到 追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法 点击上面黑色箭头出现两个实现方法 点击第一个方法 进入determineBeanNameFromAnnotation方法中 通过上诉自定义一个生成beanName方法 先创建一个CustomeBeanN…

60 个 CSS 选择器,一网打尽!

CSS 选择器用于选择 HTML 元素并将样式应用于它们。使用这些选择器&#xff0c;可以定义特定条件下应用哪些样式。除了普通的选择器外&#xff0c;还有伪类和伪元素&#xff0c;用于选择具有特定状态或特定部分的元素&#xff0c;并将样式应用于它们。本文将通过图文并茂的方式…

Windows11家庭版安装Docker

文章目录 安装Docker安装hyper-v继续解决报错完成效果图进一步测试是否完成安装 安装Docker windows如何安装docker 装好之后&#xff0c;我打开报错。 安装hyper-v 按这个视频操作&#xff1a;Windows 11 家庭版安装 Hyper-V bat文件里的代码是&#xff1a; pushd "…

【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)

【投稿优惠|快速见刊】2024年图像&#xff0c;机器学习和人工智能国际会议&#xff08;ICIMLAI 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icimlai.com会议地址&#xff1a;深圳召开日期&#xff1a;2024.03.30截稿日期&#xff1a;2024.03.20 &#xff08;先…

2024全国水科技大会暨高氨氮废水厌氧氨氧化处理技术论坛(四)

一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战&#xff0c;加快生态环境科技创新&#xff0c;构建绿色技术创新体系&#xff0c;全面落实科学技术部、生态环境部等部委编制的《“十四五”生态环境领域科技创新专项规划》&#xff0c;积极落实省校合作&…

什么是BGP网络 (边界网关协议)

BGP&#xff08;边界网关协议&#xff09;是一种用于在互联网中交换路由信息的协议。作为网关或路由器之间的协议&#xff0c;BGP主要用于帮助确定数据包在网络中的路径。它通过在不同自治系统&#xff08;AS&#xff09;之间交换路径信息&#xff0c;实现了全球互联网网络的连…

MySQL进阶之(三)InnoDB数据存储结构之数据页结构

三、InnoDB数据存储结构之数据页结构 3.1 数据库的存储结构3.1.1 MySQL 数据存储目录3.1.2 页的引入3.1.3 页的概述3.1.4 页的上层结构 3.2 数据页结构3.2.1 文件头和文件尾01、File Header&#xff08;文件头部&#xff09;02、File Trailer&#xff08;文件尾部&#xff09; …

【JavaEE】_Spring Web MVC简介

目录 1. Spring Web MVC简介 2. MVC简介 3. Spring MVC 1. Spring Web MVC简介 官网对于Spring Web MVC的介绍如下&#xff1a; 链接如下&#xff1a; https://docs.spring.io/spring-framework/reference/web/webmvc.html#https://docs.spring.io/spring-framework/refer…

将SU模型导入ARCGIS,并获取高度信息,多面体转SHP文件(ARCMAP)

问题:将Sketchup中导出的su模型,导入arcgis并得到面shp文件,进而获取各建筑的高度、面积等信息。 思路: (1)导入arcgis得到多面体 (2)转为面shp文件 (3)计算高度/面积等 1、【3D Analyst工具】【转换】【由文件转出】【导入3D文件】(在此步骤之间,建议先建立一个…

栈和队列OJ题

文章目录 一、双队列实现栈二、双栈实现队列 一、双队列实现栈 题目链接&#xff1a; https://leetcode.cn/problems/implement-stack-using-queues/description/ 题目分析&#xff1a; 栈的结构是后进先出&#xff0c;而队列的结构是先进先出&#xff0c;我们利用这个性质&a…

AI Word Helper (Chorme Extentions) AI单词助手(谷歌浏览器插件)

AI Word Helper (Chorme Extentions) AI单词助手&#xff08;谷歌浏览器插件&#xff09; 英文网站&#xff0c;划词查单词&#xff0c;还是看不懂&#xff1f;因为单词意思那么多&#xff0c;词性搞不清&#xff0c;上下文搞不清&#xff0c;出来的意思就没法用&#xff0c;G…

一个基于轮询的广告系统

无论PC 客户端还是手机客户端&#xff0c;可能会遇到需要发布一些广告&#xff0c;这些广告可能是自己开发的&#xff0c;可能是三方的&#xff0c;而且希望是比较通用&#xff0c;能随时发布&#xff0c;随时就能看到效果。 本文提供了一种基于轮询的广告系统&#xff0c;主要…

【服务器数据恢复】昆腾存储中raid5磁盘阵列数据恢复案例

服务器数据恢复环境&故障&#xff1a; 10个磁盘柜&#xff0c;每个磁盘柜配24块硬盘。9个磁盘柜用于存储数据&#xff0c;1个磁盘柜用于存储元数据。 元数据存储中24块硬盘&#xff0c;组建了9组RAID1阵列1组RAID10阵列&#xff0c;4个全局热备硬盘。 数据存储中&#xff0…