每日一题:LeetCode-LCR 143.子结构判断

简介: 每日一题:LeetCode-LCR 143.子结构判断

每日一题系列(day 05)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


题目:

   给定两棵二叉树 tree1 和 tree2,判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。注意,空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。

示例1:

示例2:

注意事项:

  • 0 <= 节点个数 <= 10000

思路:

  首先我们来思考,一棵树的结构有哪些情况?

1、B树为空或者AB都为空的情况,但是题目明确要求了,AB有一个为空,都不为另一棵树的子结构,所以第一点情况是false。

2、B树是A树的一颗子树,这个肯定满足时A的子结构。

3、B树是A树的一部分,并非子树,题目示例也说明了这种B树是A树的子结构。

那么我们来看看这三点能总结出什么规律?A树B树必须都不为空树,而且B树一定要是A树的一部分结构或者就是A树,这才能满足B是A的子结构。

  1、首先,A树与B树都不能为NULL,如果为NULL直接返回false。

  2、接下来就要判断A的当前节点是否与B的根节点的值相等,如果相等则从这里开始匹配,看是否能够匹配成功,成功直接返回true即可。

  3、进入到匹配函数,如果遍历到的A的当前节点为空,B的节点也为空,则表示匹配成功,如果A为空,B不为空就是匹配失败。如果匹配的当前B节点为空,A不为空,也表示B树是A树的子结构则返回true。

  4、为空的情况我们判断完了,就要判断A,B节点的值是否相等了,不相等也是返回false,到了这一步,还没返回说明我们还要继续往下遍历,所以这个时候我们就需要分别向A树B树的左右子树遍历了。函数结束。

  5、如果当前节点不匹配,那么就向A的左子树查找,是否存在于B树根节点所匹配的节点,如果有就再次匹配…同理,如果左子树没有此节点,那么向右子树遍历。

  6、当左右子树都遍历完成之后,也没有匹配的节点,那么就说明A树中没有B树这样的子结构,这时我们返回false即可。

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool match(TreeNode *A, TreeNode *B)
    {
        if(A == NULL) return B == NULL;//如果A当前节点为空且B的节点也为空则表示匹配成功,否则如果A为空,B不为空就匹配失败。
        if(B == NULL) return true;//如果此时B已经为空了,说明前面已将匹配了,返回true即可
        if(A -> val != B -> val) return false;//只要两个值不相等就直接返回false
        return match(A -> left, B -> left) && match(A -> right, B -> right);//向两棵树的左子树和右子树遍历,遍历完成之后
    }
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(A == NULL || B == NULL) return false;//根据题目意思,如果A为空或者B为空时,都不满足子树结构
        if(A -> val == B -> val && match(A, B)) return true;//进行比较,如果A树的值与B树的值相等则从当前节点开始匹配。
        if(isSubStructure(A -> left, B)) return true;//匹配不成功向A的左子树与B的根节点匹配
        if(isSubStructure(A -> right, B)) return true;//同理向A的右子树与B的根节点匹配
        return false;//匹配的情况全部没了,剩下的就是不匹配的情况
    }
};

  这样我们就完成了二叉树子结构判断的一道题目了,题目理解不是很难,主要是一些边界条件并不是很容易想,想不全就总有几个测试用例过不了。

相关文章
|
监控 供应链 物联网
ERP系统中的在制品管理与工艺路线规划
ERP系统中的在制品管理与工艺路线规划
453 2
|
SQL 存储 缓存
Paimon与Spark
Paimon与Spark
631 1
|
4月前
|
JSON 搜索推荐 数据挖掘
巧用京东 API,精准把握京东平台用户消费偏好
在电商竞争激烈的环境下,精准把握用户消费偏好对提升转化率和优化营销策略至关重要。京东作为国内领先的电商平台,提供丰富的开放 API,支持开发者获取用户行为、订单、浏览等数据。通过调用这些 API,企业可深入分析用户偏好,构建个性化推荐与精准营销方案。本文详细介绍了如何通过京东 API 获取数据、分析用户偏好,并结合实际案例展示其应用场景与效果,助力企业提升运营效率与市场竞争力。
307 0
|
10月前
|
监控 数据可视化 数据挖掘
项目管理精细化:如何提高执行效率?
在竞争激烈的商业环境中,高效的项目管理至关重要。本文探讨了如何优化项目管理流程,包括明确目标、制定可执行计划、建立沟通机制、应对风险及利用可视化工具(如看板)提升效率。通过持续复盘与优化,团队能不断提升执行力,确保项目按时按质交付。
448 19
|
前端开发 JavaScript 中间件
【前端状态管理之道】React Context与Redux大对决:从原理到实践全面解析状态管理框架的选择与比较,帮你找到最适合的解决方案!
【8月更文挑战第31天】本文通过电子商务网站的具体案例,详细比较了React Context与Redux两种状态管理方案的优缺点。React Context作为轻量级API,适合小规模应用和少量状态共享,实现简单快捷。Redux则适用于大型复杂应用,具备严格的状态管理规则和丰富的社区支持,但配置较为繁琐。文章提供了两种方案的具体实现代码,并从适用场景、维护成本及社区支持三方面进行对比分析,帮助开发者根据项目需求选择最佳方案。
553 0
|
10月前
|
关系型数据库 分布式数据库 数据库
PolarDB开源数据库进阶课8 任意时间点恢复(PITR)
本文介绍了如何在PolarDB RAC一写多读集群中进行时间点恢复(PITR)。实验环境依赖于Docker容器中的loop设备模拟共享存储。首先,确保已开启实时归档并完成全量备份。接着,在主节点生成数据并创建恢复点。然后,通过修改配置文件和添加恢复标记文件,使用备份和归档日志将数据库恢复到指定的时间点。最后,验证数据是否已成功恢复,并关闭恢复库。参考了多个相关文档和系列文章,详细步骤和配置请参阅提供的链接。
233 0
|
敏捷开发 人工智能 搜索推荐
效率管理软件如何改变工作方式?全面介绍与应用场景
本文深入探讨了效率管理工具的定义、发展历程、功能特点及类型分类,帮助职场人士和团队更好地理解和选择这些工具,以提升整体工作效率。从个人任务管理到团队协作,效率管理工具通过优化工作流程、简化操作步骤和提升沟通效率,为现代工作方式提供了坚实支撑。
|
弹性计算 网络协议 UED
SLB-Backend会话保持
【10月更文挑战第21天】
366 7
|
分布式计算 Ubuntu Hadoop
在Ubuntu 16.04上如何在独立模式下安装Hadoop
在Ubuntu 16.04上如何在独立模式下安装Hadoop
188 1
|
传感器 存储 SQL
LabVIEW使用ModbusTCP协议构建分布式测量系统
LabVIEW使用ModbusTCP协议构建分布式测量系统
363 4