如何识别二叉树的“亲戚”?——探秘判断子树的奥妙

news2024/11/17 5:48:37

在这里插入图片描述

本篇博客会讲解力扣“572. 另一棵树的子树”的解题思路,这是题目链接。先来审题:

在这里插入图片描述
本题的思路是:使用递归,把大问题化作小问题。

先来思考:如何判断q是不是p的子树呢?

q是p的子树有3种情况,分别是:

  1. q和p相同。
  2. q是p的左子树的子树。
  3. q是p的右子树的子树。

其中,还要讨论一些特殊情况,也就是递归的终止条件。

  1. p为空,q非空,显然q不是p的子树。
  2. p非空,q为空,显然q是p的子树,不过这一点不用单独讨论。
  3. p和q都为空,显然q是p的子树,不过这一点不用单独讨论,后面判断2棵树是否相同时,2棵空树是相同的。

对于判断q是不是p的左子树和右子树的子树这个问题,就是很简单的递归调用。那么问题就转换成了如何判断2棵树相同,这又是另一个经典问题了。

如何判断2棵树p和q相同呢?p和q相同必须同时满足以下3点:

  1. 根节点的值相同。
  2. p的左子树和q的左子树相同。
  3. p的右子树和q的右子树相同。

其中,还要讨论一些特殊情况,也就是递归的终止条件。

  1. p为空,q为空,此时2棵树相同。
  2. p和q中,其中一棵树为空,另一棵非空,2棵树不相同。

理解了以上几点,就可以写代码了。

// 判断2棵树是否相同
bool IsSameTree(struct TreeNode* p, struct TreeNode* q)
{
    // 2棵树都是空树
    if (p == NULL && q == NULL)
    {
        return true;
    }

    // 1棵树是空树,另一棵非空
    if (p == NULL || q == NULL)
    {
        return false;
    }

    // 2棵树相同当且仅当值相同,左右子树分别相同
    return p->val == q->val
        && IsSameTree(p->left, q->left)
        && IsSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    // 非空树不是空树的子树
    if (root == NULL && subRoot)
    {
        return false;
    }

    // 先判断2棵树是否相同
    // 再判断是不是左子树和右子树的子树
    return IsSameTree(root, subRoot)
        || isSubtree(root->left, subRoot)
        || isSubtree(root->right, subRoot);
}

在这里插入图片描述
这样就通过了。

总结

大家需要掌握如何判断子树,以及如何判断2棵树是否相同这2个问题。

判断子树需要注意以下3点,它们之间是“或者”的关系:

  1. 2棵树是否相同。
  2. 是不是左子树的子树。
  3. 是不是右子树的子树。

判断2棵树是否相同需要注意以下3点,它们之间是“并且”的关系。

  1. 根结点的值是否相同。
  2. 左子树是否相同。
  3. 右子树是否相同。

理解了以上几点,类似的问题就迎刃而解了。

感谢大家的阅读!

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

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

相关文章

不断进化!奇点云助豫园股份构建集团统一战略的数据平台

“一张图、一颗心、一场仗,构建集团统一战略的数据平台,豫园股份不断进化。” 日前,2023 StartDT Day 数智科技大会正式举办。企业客户、行业专家、技术专家与数万位参会伙伴相聚云上,共话数据时代进化之道。 作为消费产业的数字…

Spring Cloud - Ribbon 负载均衡原理、负载策略、懒加载

目录 ​编辑 一、Ribbon 负载均衡原理 1.1、前言 1.2、负载均衡的工作流程 二、负载均衡策略 2.1、策略原理 2.2、负载均衡自定义方式 三、Ribbon 加载方式 一、Ribbon 负载均衡原理 1.1、前言 ps:案例是上一章所讲的 “根据订单id查询订单的同时&#xff0…

Matlab机器人运动学与正逆解算法学习笔记

文章目录 ※ 参考资料建立DH模型△ 基本概念和标准DH/改进DH○ 连杆与关节的编号○ 标准DH与改进DH △ DH参数模型建立方法○ 标准DH参数定义及方法简介 连杆坐标系建立方法 标准DH参数含义※ 关于DH参数以哪个轴的指向为准的问题 标准DH坐标系间的齐次变换矩阵 ○ 改进DH参数…

WPS AI内测申请窍门;AI数字人最全工具盘点;AI超级个体必读书籍;产品国际化与本地化指南;生成式AI应用路线图 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 生成式AI应用路线图:多模态AI的应用能力演进 随着生成式AI「对生成内容的可控性」不断提高,其应用场景也在不断…

【算法系列 | 6】深入解析排序算法之——堆排序

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 决定开一个算法专栏,希望能帮助大…

整理 钢琴教材 铃木钢琴教程(铃木)

邮箱不能及时回复,现放到网盘里了,文末按需自取 铃木钢琴教程第1册 文件名:铃木钢琴教程第1册 超清PDF 文件大小:7.05 MB 下载地址:https://download.csdn.net/download/qq_36040764/85051148 铃木钢琴教程第2册 文件名:铃木钢琴教程第2册 超清PDF 文件大小:5.54 …

边缘检测笔记

边缘是什么? 图像的边缘是指图像局部区域中亮度变化明显的部分,边缘位于像素的灰度值产生突变的地方。 边缘的正负之分:由暗到亮为正,由亮变暗为负。 图像的高频信号和低频信号 简单理解为,图像中高频分量&#xff08…

在Windows11平台安装JDK11(双11)

目录 引言一、安装前说明1.系统要求2.多版本安装 二、JDK11安装三、安装成功验证1.验证2.Path环境变量 总结 引言 本文主要是详细讲解在 Windows 11 系统上安装 JDK 11,安装时有一些注意事项需要说明。与 JDK 8 的安装过程有少许不一样。 一、安装前说明 1.系统要…

GPT-4的中国2023高考作文

我选取2023年上海的作文题(我比较感兴趣),题目如下: 面对这个题目,不知道各位有什么想法么?如果你去考试,你会怎么写? 来,我们看看AI是怎么写的。 以下是GPT-4的作文&a…

vmware虚拟机网络“桥接模式”与“NAT模式”的联网原理及linux环境下IP配置指引

一、vmware虚拟机网络“桥接模式”与“NAT模式”的区别 选中虚拟机》设置》网络适配器,打开虚拟机设置面板 我们看到网络连接处有多个选项,今天良哥通过试验告诉你“桥接模式”和“NAT模式”的联网原理、区别及两种模式下IP地址配置的详细方法。 桥接模…

spring-data-elasticsearch.4.2.0 jar包冲突导致:StackOverflow

最近要求es做升级改造: 目前版本: 1. springframework 4.3.3-RELEASE 2. spring-data-elasticsearch: 2.0.3 3. elasticsearch: 2.4.0 4. 工具类: ElasticsearchTemplate 升级后ES版本7.10.0 1. springframework 升级到 5.3.10 2. spring-data-elasticsearch 升级到 4.…

热门bi报表软件推荐,哪款bi报表软件更功能更强大?

随着商业智能(BI)的不断发展和应用,越来越多的企业开始关注和使用BI报表软件。但是在众多的BI报表软件中,如何选择一款既功能强大又易于使用的软件,成为了许多企业和个人面临的难题。下面将为大家介绍5款热门的BI报表软…

爆肝百万字;学完这些你的python就无敌了

前言 最近高考刚刚结束,不少大学也快陆陆续续的要放暑假了,不少人表示暑假想学点python知识,或提升下自己,或打算学点技术兼职赚点零花钱,于是肝了一份Python最新学习文档总结资料 :全文档1378页&#xff…

Python的离线安装

原文链接 在没有外网的情况下,安装Python环境只能采用离线方式。 Windows离线安装Python Python离线安装包的下载地址:https://www.python.org/ftp/python/ 我选择的是:python-3.8.5-amd64.exe 双击运行安装包即可完成安装。 安装完成后…

简化本地Feign调用

在平常的工作中,OpenFeign作为微服务间的调用组件使用的非常普遍,接口配合注解的调用方式突出一个简便,让我们能无需关注内部细节就能实现服务间的接口调用。 但是工作中用久了,发现 Feign 也有些使用起来麻烦的地方,…

【Haproxy 搭建Web 群集】

目录 一、Haoroxy 基础了解1、常见的Web集群调度器2、Haproxy 应用分析 二、Haproxy 调度算法原理三、HAProxy的主要特性四、HAProxy负载均衡策略五、LVS、Nginx、HAproxy的区别1、Nginx的优点,缺点2、LVS的优点和缺点3、HAProxy的优点 六、Haproxy搭建 Web 群集实验…

跟着LearnOpenGL学习8--摄像机

文章目录 一、前言二、摄像机/观察空间2.1、摄像机位置2.2、摄像机方向2.3、右轴2.4、上轴2.5、LookAt2.6、LookAt测试 三、自由移动3.1、移动速度 四、视角移动4.1、欧拉角 五、鼠标输入5.1、缩放 六、摄像机类 一、前言 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵…

【软考系统架构师】进程与线程、并发和并行的理解

进程和线程的概念是软考里经常出现的概念,也是计算机领域的基础概念之一,看到一套非常形象的进程和线程的解释,记录一下 CPU 相当于一个工厂的能源核心,它一直运行,并向外提供动力。 什么是进程 但是这家工厂资金有限&…

A*算法与八数码问题(numpy)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 目录 一、引言 二、思路 1. 确定问题和目标: 2. 确定算法和数据结构: 3. 编写代码框架 4. 实现辅助函数&#xff1…

CreateML 使用以及机器学习基础概念

1. 前言 在学习 CreateML 之前,我们先了解一下什么是机器学习?目前还不存在被广泛认可的定义来准确定义机器学习是什么。第一个机器学习的定义来自于Arthur Samuel。他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力…