树的子结构

news2025/1/16 1:59:06
声明

该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油!

原题链接

树的子结构icon-default.png?t=N6B9https://leetcode.cn/leetbook/read/illustration-of-algorithm/5dshwe/

算法分析

        根据题目可以获得以下三个信息:

        1.树的子结构:如图1中的(2)是不属于(1),而属于(3)的子结构,(4)是属于(1),而不属于(3)的子结构。

        2.空树不是任意一个树的子结构。

        3.题目中的树均为二叉树。

图1

         然后明确两个问题:

        (1)空树怎么判断?

        空树即为节点为空的树。

        (2)如何判断树B是否为树A的子结构?

        在树A中找到与树B的root节点值相同的节点,保存在一个列表中,然后依次以列表中的节点作为起始节点在树A中进行遍历,遍历过程中记录树B中剩余待遍历节点的数量count。

        ①若count为0,则表示树B遍历完毕则return True

        ②若当前树B的节点为空则return True

        ③若当前树A与树B的节点值相同则遍历二者的左右节点,重复①②③④;

        ④其它情况return False

代码示例(C#)
//二叉树节点
public class TreeNode
{
    public int val;
    public TreeNode? left;
    public TreeNode? right;

    public TreeNode(int x)
    { val = x; }
}

public bool IsSubStructure(TreeNode A, TreeNode B)
{
    //检测是否为空树
    if (A == null || B == null) return false;
    //查询树A中与树B的root节点值相同的节点,并将它们保存在列表中
    List<TreeNode> rootNodes = new List<TreeNode>();
    FindRootNode(A, B, ref rootNodes);
    //如果树A中不存在与树B的root节点值相同的节点则返回false
    if (rootNodes.Count == 0) return false;
    int count = 1;//记录子树中剩余待查询的节点数
    foreach (TreeNode node in rootNodes)
    {
        //每个节点都将作为一次搜索的起始点
        if (Search(node, B, ref count)) return true;
        count = 1;
    }
    return false;
}

//搜索方法
//参数:树A的节点,树B的节点,树B中剩余待查询的节点数
private bool Search(TreeNode? A, TreeNode? B, ref int count)
{
    if (count == 0) return true;//树B搜索完毕
    else if (B == null) return true;//树B的节点为空
    else if (A != null && B != null)
    {
        if (A.val == B.val)
        {
            count--;
            if (B.left != null) count++;
            if (B.right != null) count++;
            return Search(A.left, B.left, ref count) && Search(A.right, B.right, ref count);
        }
    }
    return false;
}

//寻找树A中与树B的root节点相同的节点的方法
//参数:树A的节点,树B的节点,root节点列表
private void FindRootNode(TreeNode? A, TreeNode B, ref List<TreeNode> rootNodes)
{
    if (A == null) return;
    if (A.val == B.val) rootNodes.Add(A);
    if (A.left != null) FindRootNode(A.left, B, ref rootNodes);
    if (A.right != null) FindRootNode(A.right, B, ref rootNodes);
}
算法解说

       结合题目描述,我们可以明确什么是一棵树的子结构以及空树不作为任何树的子结构,在这个基础上我们去挖掘题目的变量和逻辑主体,因为二者是我们将分析思路转换为代码的关键点。粗略一看本题似乎并不需要单独定义什么变量,而逻辑主体则包括怎么判断空树以及如何确定一棵树是否为另一棵树的子结构,这两个问题我们在算法分析中进行了解答。

        但是在逻辑主体中我们很容易忽略一个特殊情况,例如我们需要判断树B是否为树A的子结构,那么我们需要先在树A中找到与树B的root节点相同的节点,但是相同的节点可能不止一个,这是我们需要去考虑的问题,题目并没有规定一棵树中不能存在相同节点。因此,在我们判断树B是否为树A的子结构之前应该在树A中找到所有与树B的root节点相同的节点,并且让它们依次作为root节点去进行判断。这也就是FindRootNode方法的由来,因此我们还是需要一个变量用来存储这些root节点。

        所以事实上我们还是需要两个变量,一个用来记录子树中剩余待查询的节点数,另一个用来存储root节点集合。

        现在明确了本题的变量和逻辑主体,那么将思路转换为代码就比较快捷了。

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

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

相关文章

每天一道leetcode:剑指 Offer 36. 二叉搜索树与双向链表(中等深度优先遍历递归)

今日份题目&#xff1a; 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 示例 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于…

ps怎么压缩图片大小200k?图片压缩技巧来啦

ps是我们常用的一款图像处理软件&#xff0c;有很多功能&#xff0c;可以帮助我们有效地进行图片编辑和创造工作&#xff0c;当然用它也可以压缩图片的大小&#xff0c;如果你还不知道怎么用ps压缩图片大小&#xff0c;不妨继续看下去吧。 方法一&#xff1a;调整图片品质 1、…

用AI攻克“智能文字识别创新赛题”,这场大学生竞赛掀起了什么风潮?

文章目录 一、前言1.1 大赛介绍1.2 项目背景 二、基于智能文字场景个人财务管理创新应用2.1 作品方向2.2 票据识别模型2.2.1 文本卷积神经网络TextCNN2.2.2 Bert 预训练微调2.2.3 模型对比2.2.4 效果展示 2.3 票据文字识别接口 三、未来展望 一、前言 1.1 大赛介绍 中国大学生…

深度学习2:过拟合解决办法

1.通过噪声正则化解决过拟合问题 噪声正则化是一种解决过拟合问题的有效方法。该方法通过向训练数据添加随机噪声&#xff0c;从而使模型更加鲁棒&#xff0c;并减少对训练数据的过度拟合。噪声正则化可以通过多种方式实现。其中一种常见的方法是在输入数据中添加随机噪声。例…

2682. 找出转圈游戏输家

题目描述&#xff1a; n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i 1) 个朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而从第 n 个朋友的位置开始顺时针移动 1 步…

华为OD机试 - 公共子串计算(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

AI助力林业有害生物防治,基于YOLOv5开发构建林业有害生物检测识别系统

林业有害生物防治是指针对危害森林健康的昆虫、病原菌、杂草等有害生物进行预防和控制的活动。这些有害生物可能会导致树木的衰弱、死亡&#xff0c;破坏森林生态系统的平衡&#xff0c;影响木材产量和质量&#xff0c;甚至对人类社会造成经济和环境损失。 以下是一些常见的林业…

MySQL数据库-进阶篇

进阶篇 一、MySQL体系结构 二、存储引擎 简介 存储引擎特点 InnoDB &#xff08;默认&#xff09; MyISAM Memory 存储引擎区别 存储引擎选择 ​​ 小结 三、索引 配置Linux版本的mysql --nodesp和--force linux防火墙相关操作 https://blog.csdn.net/weixin_437…

蓝牙、语音合二为一,启英泰伦CI231系列AI语音BLE芯片

随着智能家居的快速发展和人们对个性化体验的追求&#xff0c;近期启英泰伦推出了令人振奋的创新产品——CI231系列AI语音BLE芯片。这一系列芯片将语音与BLE技术巧妙融合&#xff0c;为用户提供了更丰富的设备连接选项和更个性化的语音交互体验。 CI231系列芯片实物图 CI231系…

Python流程控制指南:实例解析与技巧揭秘

流程控制是编程中至关重要的概念&#xff0c;它允许我们按照特定的条件执行代码块&#xff0c;实现逻辑控制和决策。本篇博客将深入讨论Python语法中的流程控制&#xff0c;结合实际案例为你解析如何巧妙地应用流程控制来构建更强大的程序。 条件语句&#xff1a;if、elif和el…

【C++学习手札】一文带你初识运算符重载

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;クリームソーダとシャンデリア—Edo_Ame江户糖 1:20 ━━━━━━️&#x1f49f;──────── 3:40 …

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展&#xff0c;爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中&#xff0c;由于个人或机构的目的不同&#xff0c;也会面临一些访问限制或者防护措施。这时候&#xff0c;使用HTTP代理爬虫可以有效地解决这些问题&#xff0…

C4D那些超酷的插件,你知道几个?

Cinema 4D 是最著名的 3D 软件之一&#xff0c;由于其便利性和多功能性&#xff0c;艺术家和工作室经常在许多领域使用。尽管它被认为是一款一体化软件&#xff0c;但您仍然可以找到许多很酷的工具或插件&#xff0c;帮助您获得更好的结果并节省时间和金钱。 赞奇云工作站带领…

解放双手!写了个小工具给喜欢的博主一键三连

1. 写在前面 大家写博客的可能都知道&#xff0c;有时候我们或多或少会认识一些志同道合的博主。大家在写博客的时候偶尔也都会彼此之间相互支持一下 再如果看到自己感兴趣的文章&#xff0c;想收藏一下。这些需求我们目前大部分人都自己用手去操作&#xff0c;这是非常费力的…

恒运资本:布林线什么意思?

布林线是一种经过股票价格的标准差核算出涨跌起伏的技能剖析方法。这种剖析方法由约翰布林在1980年左右开发而来&#xff0c;是一种常用的股市剖析东西。本文将从前史、原理、应用等多个视点叙述布林线的含义&#xff0c;以及它对出资者所带来的意义。 一、前史 布林线在1983年…

解决方案:如何在 Amazon EMR Serverless 上执行纯 SQL 文件?

长久已来&#xff0c;SQL以其简单易用、开发效率高等优势一直是ETL的首选编程语言&#xff0c;在构建数据仓库和数据湖的过程中发挥着不可替代的作用。Hive和Spark SQL也正是立足于这一点&#xff0c;才在今天的大数据生态中牢牢占据着主力位置。在常规的Spark环境中&#xff0…

目前互联网企业知识库使用情况?企业知识库搭建缺陷有什么?

目前互联网企业普遍使用知识库作为内部和外部知识管理的工具。知识库通过集中存储和组织企业内部的知识和信息&#xff0c;使其易于访问和共享 目前互联网企业知识库使用情况&#xff1a; 内部知识管理&#xff1a; 知识库用于内部员工的知识共享和知识管理。企业可以将各个…

5款专业思维导图软件推荐:提升效率,促进协作!

思维导图作为一种有效的信息组织和可视化工具&#xff0c;已经广泛地应用于学习、工作和生活中。通过思维导图&#xff0c;我们能够以高效的方式把握和处理大量信息。 但到了挑选软件的环节&#xff0c;市面上层出不穷的思维导图软件&#xff0c;容易让人看花眼&#xff0c;不知…

matlab使用教程(17)—广度优先和深度优先搜索

1.可视化广度优先搜索和深度优先搜索 此示例说明如何定义这样的函数&#xff1a;该函数通过突出显示图的节点和边来显示 bfsearch 和 dfsearch 的可视化结果。 创建并绘制一个有向图。 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G dig…

【Bug解决】1、Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.133的响应时间过长)

项目场景&#xff1a; 在虚拟机上通过Docker创建Nacos容器&#xff0c;已经创建成功&#xff0c;查看Nacos启动日志也是成功。但通过端口号加8848/nacos&#xff08;如&#xff1a;http://192.168.88.10:8848/nacos&#xff09;无法访问到Nacos管理页面。 问题描述 原因分析&a…