Tree_Graph 判断T2是否为T1的子树 @CareerCup

【科学刷题】树的子结构与子树判断 文章目录1. 判断【树B】是否是【树A】的【子结构】/【子树】1.1 概念阐述1.2 完全匹配的情况1.3 部分匹配的情况2. 查找所有重复子树 1. 判断【树B】是否是【树A】的【子结构】/【子树】 1.1 概念阐述 首先阐述一个概念:子结构匹配与子树匹配 匹配: 完全匹配就是A的子结构与B完全匹配 部分匹配: 部分匹配就是A的子结构与B部分匹配,A的子结构允许有与B不匹配的其他结构 如何判断是【完全匹配】还是【部分匹配】呢?我们需要仔细读题: 1.2 完全匹配的情况 1.3 部分匹配的情况 2. 查 阅读详情

原文:

You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of T1

译文:

有两棵很大的二叉树:T1有上百万个结点,T2有上百个结点。写程序判断T2是否为T1的子树。


思路:

1) 因为中序前序遍历就可以决定一棵树,把两棵树的中序前序都写出来,如果两个遍历中T2都是T1的子串,可以确定T2是T1的子树。

当然这会遇到无法区分


的情况。因为

T1, in order: 3,3    T1, pre order 3,3

T2, in order: 3,3    T2, pre order 3,3

所以必须也算入null节点,所以

T1, in order: 0, 3, 0, 3, 0    T1, pre order 3, 3, 0, 0, 0

T2, in order: 0, 3, 0, 3, 0    T2, pre order 3, 0, 3, 0, 0

这种方法时间复杂度:O(n+m), 空间复杂度:O(n+m) , n,m分别为两个树的节点数。当海量数据时不适用!

2)递归!从根节点往下递归,判断子树是否存在其的左子树或右子树内。
时间复杂度:O(nm), 空间复杂度:O(log(n) + log(m))
但实际上,在真实的运行时,递归假如发现满足子树的条件就直接返回,而不会继续查找。因此递归法在实际中无论时间空间更优!

package Tree_Graph;

import CtCILibrary.AssortedMethods;
import CtCILibrary.TreeNode;

public class S4_8 {

	// 判断t2是否是t1的子树
	public static boolean isSubTree(TreeNode t1, TreeNode t2) {
		if(t2 == null) {			// 空树始终是另一个树的子树
			return true;
		}
		if(t1 == null) {		// 此时r2非空,非空树不可能是一个空树的子树
			return false;
		}
		if(t1.data == t2.data) {			// 找到两树匹配
			if(isSameTree(t1, t2)){
				return true;
			}
		}
		
		// 继续在r1的左子树和右子树里找匹配
		return isSubTree(t1.left, t2) || isSubTree(t1.right, t2);
	}
	
	// 判断两棵树是否相同
	public static boolean isSameTree(TreeNode t1, TreeNode t2) {
		if(t1==null && t2==null) {
			return true;
		}
		if(t1==null || t2==null) {
			return false;
		}
		
		if(t1.data != t2.data) {
			return false;
		}
		return isSameTree(t1.left, t2.left) && isSameTree(t1.right, t2.right);
	}
	
	public static void main(String[] args) {
		// t2 is a subtree of t1
		int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
		int[] array2 = {2, 4, 5, 8, 9, 10, 11};

		TreeNode t1 = AssortedMethods.createTreeFromArray(array1);
		TreeNode t2 = AssortedMethods.createTreeFromArray(array2);

		if (isSubTree(t1, t2))
			System.out.println("t2 is a subtree of t1");
		else
			System.out.println("t2 is not a subtree of t1");

		// t4 is not a subtree of t3
		int[] array3 = {1, 2, 3};
		TreeNode t3 = AssortedMethods.createTreeFromArray(array1);
		TreeNode t4 = AssortedMethods.createTreeFromArray(array3);

		if (isSubTree(t3, t4))
			System.out.println("t4 is a subtree of t3");
		else
			System.out.println("t4 is not a subtree of t3");
	}
}



 


STM32G4系列数字LLC控制程序开发实战 本文详细介绍了基于STM32G4系列MCU的数字LLC控制程序开发全流程。从开发环境搭建、中断服务函数设计,到核心的电压环PID算法、Burst模式控制、状态机设计以及软启动优化,提供了完整的实战代码和关键参数调试经验,帮助开发者高效实现高性能数字电源控制。 阅读详情

相关推荐

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

Two trees, T1 and T2, are isomorphic if T1 can be transformed into T2 by swapping left and right chi

Two trees, and , are isomorphic if can be transformed into by swapping left and right children of (some of the) nodes in . For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not the other

linjianchu的博客 852

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 614

二叉树--2-树的子结构--子树匹配

题目    输入两颗二叉树A,B,判断B是不是A的子结构。(PS:我们约定空树不是任意一个树的子结构)。思路    要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:            第一步在树A中找到和B的根结点的值一样的结点R,            第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。    使用递归的方法即可。注意    这道题目不能利用先序遍历...

ax_hacker的博客 1709

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 479

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2308

每天一个算法之子树匹配

package ff; import java.util.Scanner; class BinaryTree{ int data; BinaryTree left; BinaryTree right; } public class isSubTree { static Scanner sc=new Scanner(System.in); public static

u012749168的博客 1463

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 675

树形地铁系统

题目 题目 思路 前两种是https://www.acwing.com/solution/content/4142/中读到的。 1 我们肯定是想要把两棵树的最小表示找出来,然后看看是否相同。 在这种情况下,我们期望是每个点在其子树内按最长链长度从大到小选择子节点进行DFS,但是如果相同呢?我们就要在链上干同样的事情,理论上我认为记忆性搜索应该可以到O(n2)O(n^2)O(n2),但我更认为我打不出这个代码。 2 上一种方法的优化,就是直接把子节点的最小表示求出来,然后子节点的最小表示再按字典序拼起来,然后

蒟蒻QMQ 200

《C#零基础入门之百识百例》(七)算数运算符 -- 圆的面积

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,本文带你学习C# 中算数运算符。

陈言必行 -- Unity游戏开发领域优质博主 3614

27、物联网中的量子密钥分发:安全通信新范式

本文探讨了物联网(IoT)快速发展所带来的安全挑战,并提出量子密钥分发(QKD)作为应对新兴威胁的新范式。文章详细介绍了QKD的基础原理、BB84协议的实现流程以及其在物联网中的应用前景,同时强调了安全专业人员提升技能、制定标准化指南以及跨学科合作的重要性。通过利用量子力学特性,QKD能够提供更高的通信安全性,抵御量子计算等未来威胁,为物联网的安全发展提供保障。

tequila的博客 156

树同构简单Hash法

DESCRIPTION: 给出两棵节点数相同的树,求其是否同构,还要输出可行解(节点的匹配关系)带spj。 input 16(n个节点) 12 4 4 13 13 5 13 14 4 8 8 3 8 6 3 15 12 10 15 1 4 9 4 2 2 7 12 16 1 11 7 6 6 2 2 10 2 11 6 9 9 14 9 8

雾腾腾 824

fatal: unable to access ‘https://github.com/‘: Recv failure: Connection was reset 解决方案

本文主要介绍了fatal: unable to access ‘https://github.com/’: Recv failure: Connection was reset 解决方案,希望能对使用github的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 2万+

4-11 Isomorphic(判断两树同构)

Two trees, T1 and T2, are isomorphic if T1 can be transformed into T2 by swapping left and right children of (some of the) nodes in T1. For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not

wyx_601的博客 1470

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

lintcode子树

1.描述; 有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。  注意事项 若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。 您在真实的面试中是否遇到过这个题? 

import_torch_as_tf 339

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

572.subtree-of-another-tree

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。 示例 1: 输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true 示例 2: 输入:root = [3,4,5,1,2,null,null,null,null,0],

qq_26000415的博客 337

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)

关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 222 个,如果有 222 个(记为 uuu 和 vvv),那么一定有边 (u,v)(u,v)(u,v) ,而此时可以断开边 (u,v)(u,v)(u,v) ,新建一个节点,分别向 uuu 和 vvv 建边,这样新建的节点就是重心。上面所说的性质是:如果有两棵树,强制以重心为根,那么这两棵树同构当且仅当形成的两棵有根树同构。 而两...

女装的你,如此好看! 394

【树-简单】572. 另一棵树的子树

【题目】 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。 示例 1: 输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true 示例 2: 输入:root = [3,4,5,1,2,null,null,null,null,

... 138

leetcode: 另一个树的子树(暴力匹配,KMP,树hash)

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 一刷: class Solution: def isSubtree(self, s: TreeNode, t: TreeNode) -> bool: def help(s: TreeNo...

qqMiSa的博客 299

(245)LintCode 之判定 T2 是否为 T1的子树

题目:有两个不同大小的二叉树:T1有上百万的节点;T2有好几百的节点。请设计一种算法,判定T2是否为T1的子树。

qq_36464448的博客 517

树T1交换其(某些)左右节点的左右儿子变换成树T2,则是同构。给出一个多项式时间算法以决定是否两棵树同构

数据结构与算法分析——c语言描述 练习4.42a 答案 很惭愧,不会计算复杂度。大神看到了请指教。 int IsIsomorphic(SearchTree t1, SearchTree t2) { if (t1&&t2) { if (t1->element != t2->element) return 0; return (isomorphic(t1->left

wwj_bupt 3091

判断树T2是否为T1的子树

题目 你由两颗非常大的二叉树:T1,有几百万个节点;T2有几百个节点。 设计一个算法,判断T2是否为T1的子树。 如果T1有一个节点n,其子树与T2一模一样,则T2为T1的子树。也就是说,从节点n 处把树砍断,得到的树与T2完全相同。 分析 方法一:在规模较小且较简单的问题中,我们可以创建一个字符串,表示中序和前序遍历结果。若T2的前序遍历是T1前序遍历的子串,并且

指尖飞舞 1973

020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)

给定两个二叉树T1,T2判断T1是否是T2的子树 首先在T2中查找T1的根节点,如果找不到, 则T1不是T2的子树,如果能找到,我们可以 遍历T1,检查T1的每个结点是否对应的存在T2 中。 代码: struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; bool isExited(co

yanziguilai的专栏 2193

判定 T2 是否为 T1的子树

有两个不同大小的二叉树:T1有上百万的节点;T2有好几百的节点,判定T2是否为T1的子树。 思路:假设T1是母树,T2是子树。遍历母树,找到T1节点与T2的根节点相同的点,如果找到的话。则继续遍历T1与T2,判断是否具有相同的结构,如果有相同的结构,则T2是T1的子树,返回tr...

229

判断t2树是否为t1树的子树(Java)

判断t2树是否为t1树的子树 (牛客网—牛客题霸算法篇—NC98) 题目描述 给定彼此独立的两棵二叉树,树上的节点值两两不同,判断 t1 树是否有与 t2 树完全相同的子树。 思路 Java实现 递归 要判断t2是否为t1的子树,那么就先在t1中找到t2的根节点,然后再进行遍历。 判断从当前节点的左右子树相不相同,如果一旦出现不同,那么立即返回false。 如果t2遍历完节点,t1也遍历完节点,则证明t2为t1的子树。 如果t1先遍历完节点,t2还没遍历完节点,那么则证明t2不是t1的子树。 在isCont

ln01010的博客 436

二叉树问题---判断t1树是否包含t2树全部的拓扑结构

#判断t1树是否包含t2树全部的拓扑结构 def isContain(t1, t2): def check(t1, t2): if not t2: return True if not t1 or t1.val != t2.val: return False return check(t1.lef

冰殇的博客 885
上一篇: Tree_Graph LCA(Lowest Common Ancestor) 最低公共节点 (BST或者一般树) @CareerCup
下一篇: Tree_Graph 打印所有和为定值的路径 @CareerCup
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值