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

这篇具有很好参考价值的文章主要介绍了每日一题:LeetCode-LCR 143.子结构判断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每日一题系列(day 05)

前言:

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

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


题目:

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

示例1:

每日一题:LeetCode-LCR 143.子结构判断,每日一题,leetcode,算法

示例2:

每日一题:LeetCode-LCR 143.子结构判断,每日一题,leetcode,算法

注意事项:

  • 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;//匹配的情况全部没了,剩下的就是不匹配的情况
    }
};

  这样我们就完成了二叉树子结构判断的一道题目了,题目理解不是很难,主要是一些边界条件并不是很容易想,想不全就总有几个测试用例过不了。文章来源地址https://www.toymoban.com/news/detail-751662.html

到了这里,关于每日一题:LeetCode-LCR 143.子结构判断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月03日
    浏览(57)
  • Leetcode-每日一题【143.重排链表】

    给定一个单链表  L   的头节点  head  ,单链表  L  表示为: 请将其重新排列后变为:  不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1:     输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3] 提示: 链表的长度范围为  [1, 5 * 104] 1 = node.val = 1000 1.首先我们

    2024年02月11日
    浏览(42)
  • (链表) 143. 重排链表 ——【Leetcode每日一题】

    难度:中等 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L 0 L_0 L 0 ​ → L 1 L_1 L 1 ​ → … → L n − 1 L_{n-1} L n − 1 ​ → L n L_n L n ​ 请将其重新排列后变为: L 0 L_0 L 0 ​ → L n L_n L n ​ → L 1 L_1 L 1 ​ → L n − 1 L_{n-1} L n − 1 ​ → L 2 L_2 L 2 ​ → L n − 2 L_{n-2} L n −

    2024年02月08日
    浏览(47)
  • 【数据结构-二叉树 九】【树的子结构】:树的子结构

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【子结构】,使用【二叉树】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个地方

    2024年02月07日
    浏览(39)
  • Java——树的子结构

    牛客在线oj题——树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构 数据范围: 0 = A的节点个数 = 10000 0 = B的节点个数 = 10000 示例1 输入: {

    2023年04月21日
    浏览(35)
  • 图神经网络论文笔记(一)——北邮:基于学习解纠缠因果子结构的图神经网络去偏

    作者 :范少华 研究方向 :图神经网络 论文标题 : 基于学习解耦因果子结构的图神经网络去偏 论文链接 :https://arxiv.org/pdf/2209.14107.pdf         https://doi.org/10.48550/arXiv.2209.14107   大多数图神经网络(GNNs)通过学习输入图和标签之间的相关性来预测不可见图的标签。然而,

    2024年02月07日
    浏览(46)
  • leetcode每日一题44

    图论 dfs/bfs dfs代码框架 思路:本题要求找到被x围绕的陆地,所以边界的陆地O肯定不符合条件。那么我们只要从周边找到陆地O然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地O都变成A,然后再去重新遍历地图的时候,把剩下的O变成X,再把所有的A变成O。 确认递归函数,参数

    2024年01月19日
    浏览(45)
  • Leetcode每日一题——“移除元素”

    各位CSDN的uu们你们好呀,小雅兰又来啦,今天,小雅兰的内容是移除元素,下面,让我们进入Leetcode的世界吧   说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以

    2023年04月23日
    浏览(54)
  • 每日一题(LeetCode)----二分查找(一)

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 104 -104 = nums[i] = 104 nums 为 无重复元素 的 升序 排列数

    2024年02月08日
    浏览(50)
  • 每日一题:LeetCode-75. 颜色分类

    前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈    🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉 算法 👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包