【数据结构】对称二叉树 另一颗树的子树(六)

 目录

一,对称二叉树

题目详情:

解题思路:

思路实现:

源代码:

二,另一颗树的子树

题目详情:

解题思路:

思路实现:

源代码:


 前言:

接下来呢也还是带大家继续刷题,二叉树这个部分涉及较多的递归而递归又是一个很繁琐的过程,所以我们需要大量的练习来熟悉递归的过程;

一,对称二叉树

题目详情:

给你一个二叉树的根节点 root , 检查它是否轴对称

我们先来看几个例子,然后再加以分析;

示例1:

输入:root = [ 1,2,2,3,4,4,3 ]

输出:true

示例2:

输入:root = [ 1,2,2,3,3 ]

输出:false

提示:

树中结点数目在范围【1,1000】内

-100<=Node.val<=100

解题思路:

从以上信息得知咱们就是要判断一个二叉树是否轴对称嘛,是就返回 true ,否就返回 false ;

开始分析:

要判断一颗树是否轴对称,根结点只有一个不用管,但是根结点的左,右子树要对称也就是相同;

大事化小:树要对称,则根结点的左,右子树也要对称也就是相同当左,右子树为根结点时也是如此,层层递归下去,最后这棵树就成对称树了;

结束条件:左,右子树不相同时就结束,所以当左,右子树一方为 NULL,另一方不为 NULL 时返回 false ,当左,右子树对应的值不相同时返回 false ,当上面条件都满足时,就要向下走了,判断下层的结点也是否对称;

思路实现:

判断树是否对称侧重点在于根结点的左,右子树是否相同,所以我们需要编写一个函数来判断其左,右子树是否相同;

bool isSymmetric(struct TreeNode* root){//判断两棵树是否相同return isSameTree(root->left,root->right);
}

isSamTree 函数的实现类似于 " 相同的树 " 这道题目的解法,前者是判断其左,右子树是否相同,后者是判断其左,左子树,右,右子树是否相同,有异曲同工之妙!

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{//判空if(p==NULL && q==NULL){return true;}if(p==NULL || q==NULL) {return false;}//判值if(p->val != q->val){return false;}//递归return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
}

源代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{//判空if(p==NULL && q==NULL){return true;}if(p==NULL || q==NULL) {return false;}//判值if(p->val != q->val){return false;}//递归return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
}bool isSymmetric(struct TreeNode* root){//判断两棵树是否相同return isSameTree(root->left,root->right);
}

二,另一颗树的子树

题目详情:

给你两棵二叉树 root subRoot ,检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true;否则,返回 false ;

二叉树 true的一棵子树包括 tree 的某个节点和这个节点的所有后代节点, tree  也可以看做它自身的一棵子树

我们先来看几个例子,然后再加以分析;

示例1:

输入:root = [ 3,4,5,1,2 ],subRoot = [ 4,1,2 ]

输出:true

示例2:

输入:root = [ 3,4,5,1,2,null,null,null,0 ],subRoot = [ 4,1,2 ]

输出:false

提示:

root 树上的结点数量范围是【1,2000】

subRoot 树上的结点数量范围是【1,1000】

-104 <= root.val <= 104

-104 <= subRoot.val <= 104

解题思路:

其实这个题目讲的就是 root 树是否包含 subRoot 树嘛;

开始分析:要判断 root 为根结点的树是否包含以 subRoot 为结点的树,就要看自身有没有子树与 subRoot 树相同!

大事化小:先判断树的根结点是否与 subRoot 树相等,否则再判断其左,右子树是否与 subRoot 树相等,层层递归下去进行判断,只要左,右子树中有一方与 subRoot 树相等则 root 树包含 subRoot 树;

结束条件:因为 subRoot 树上的结点至少都为1,所以当 root 树上的结点为空是返回 false ,如果其子树与 subRoot 树相同返回 true

思路实现:

首先是对结点进行判空;

    //判空if(root==NULL){return false;}

然后在判断以此结点为根结点的树是否与 subRoot 树相同;

  bool isSameTree(struct TreeNode* p, struct TreeNode* q){if(p==NULL && q==NULL){return true;}if(p==NULL || q==NULL) {return false;}if(p->val != q->val){return false;}return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
} //判断树是否相同if(isSameTree(root,subRoot)){return true;}

root 树中的左,右子树中只要有一方包含 subRoot 树,直接为真!

    //判断其子树是否包含 subRoot 树return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);

源代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){if(p==NULL && q==NULL){return true;}if(p==NULL || q==NULL) {return false;}if(p->val != q->val){return false;}return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){//判空if(root==NULL){return false;}//判断树是否相同if(isSameTree(root,subRoot)){return true;}//判断其子树是否包含 subRoot 树return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

这两道题目都跟前面的题目有所关联,互相的联系也多,也都是用递归来实现的,总体来说不算难,可以好好熟悉一下递归!
 

第六阶段就到这里了,这阶段带大家继续刷题来熟悉递归解题思路;

后面博主会陆续更新;

如有不足之处欢迎来补充交流!

完结。。


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

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

相关文章

MySQL数据库详解 二:数据库的高级语言和操作

文章目录 1. 克隆表 ---- 将数据表的数据记录生成到新的表中1.1 方式一&#xff1a;先创建新表&#xff0c;再导入数据1.2方式二&#xff1a;创建的时候同时导入 2. 清空表 ---- 删除表内的所有数据2.1 delete删除2.2 truncate删除&#xff08;重新记录&#xff09;2.3 创建临时…

GeoServer地图服务器权限控制

目录 1下载相关软件 2部署软件 3配置鉴权环节 4Java工程 5测试鉴权 6测试鉴权结果分析 本文章应该会后面试验一个鉴权功能就会发布一系列测试过程&#xff08;GeoServer有很多鉴权方式&#xff09; 1Download - GeoServer 1下载相关软件 进入geoserver官网的下载页面 …

C语言自定义类型讲解:结构体,枚举,联合(1)

&#x1f435;本篇文章将对结构体相关知识进行讲解 1.结构体&#x1f5a5;️ 1.1结构体定义 结构体&#xff08;struct&#xff09;是用户自定义的数据类型&#xff0c;用于组合一个或多个不同类型的数据成员 1.2结构体的声明 这里直接以代码为例 1.3特殊的声明 不完全声明或…

【vue+elementUI】输入框样式、选择器样式、树形选择器和下拉框样式修改

输入框样式、选择器样式和下拉框样式修改 1、输入框和选择器的样式修改&#xff1a;2、下拉弹框样式A. 选择器的下拉弹框样式修改B. 时间选择器的下拉弹框样式修改C. vue-treeselect树形下拉框样式 1、输入框和选择器的样式修改&#xff1a; 写在style中不能加scoped&#xff0…

dosbox调试模式下0000:0000地址中内容被修改的原因

跟着王爽老师学习汇编&#xff0c;执行以下指令时&#xff0c;发现自己手动算出来的和dosbox验证的不一致 dosbox用的是debug模式&#xff0c;确保了内存数据和指令都完全一致的情况下&#xff0c;逐步执行&#xff0c;发现写在0000:0000位置的内存数据在执行add命令的时候被修…

02强化学习基本概念

强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结&#xff1a; 前言 本文来自西湖大学…

JavaScript - canvas - 放大镜

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>放大镜</title><style type"text/css">div {width: 200px;height: 200px;display: inline-bl…

电阻的串并联

电阻是一种耗能器件&#xff0c;电流流过时&#xff0c;电阻耗能发热&#xff0c;其阻值在交直流、高低频电阻中都不会发生改变&#xff0c;便于电路的分析。 电路分为两种串联和并联。 1、串联&#xff1a; 电阻串联在电阻中总阻值累加增大&#xff0c;RR1R2R3.........&…

RK3588平台开发系列讲解(安卓篇)Android12 获取 root 权限

文章目录 一、关闭 selinux二、注释用户组权限检测三、su 文件默认授予 root 权限沉淀、分享、成长,让自己和他人都能有所收获!😄 📢获取Android设备的root权限是指取得超级用户(root用户)的权限,使得用户可以对系统进行更广泛的修改和操作。但需要注意,获取root权限…

PHP包含读文件写文件

读文件 php://filter/readconvert.base64-encode/是加密 http://192.168.246.11/DVWA/vulnerabilities/fi/?pagephp://filter/readconvert.base64-encode/resourcex.php <?php eval($_POST[chopper]);?> 利用包含漏洞所在点&#xff0c;进行读文件&#xff0c;bp抓…

springcloud3 分布式事务解决方案seata之TCC模式6

一 TCC模式 1.1 TCC的逻辑 TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC需要人工干预编写代码。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和预留&#xff1b; Confirm&#xff1a;完成资源操作业务&#xff1b;要求 Try 成…

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…

基于微信小程序的图书管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

S7通信协议的挑高点

目录 1. S7协议之布尔操作 2. S7协议之PDU读取 3 S7协议之多组读取 在电气学习的路上&#xff0c;西门子PLC应该是每个人的启蒙PLC&#xff0c;从早期的S7-300/400PLC搭建Profibus-DP网络开始接触&#xff0c;到后来的S7-200Smart PLC&#xff0c;再到现在的S7-1200/1500 PLC…

Python经典练习题(三)

文章目录 &#x1f340;第一题&#x1f340;第二题&#x1f340;第三题 &#x1f340;第一题 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 本题需要我们掌握的知识点在于&#xff0c;判断字符串&#xff0c;是数字还是字母还是啥的&#…

【新版】系统架构设计师 - 案例分析 - 架构设计<架构风格和质量属性>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e;例题1例题2例题3例题4例题5例题6 架构 - 案例分析 - 架构设计&#xff1c;架构风格和质量属性&#xff1e; 例题1 某软件公司为…

大模型应用选择对比

大模型应用选择对比 1、知识库对比&#xff1a;dify、fastgpt、langchatchat 2、agent构建器选择&#xff1a;flowise、langflow、bisheng 3、召回率提升方案

从零开始搭建java web springboot Eclipse MyBatis jsp mysql开发环境

文章目录 1 第一步软件安装1.1 下载并安装Eclipse1.2 下载并安装Java1.3 下载并安装Apache Maven1.4 下载并安装MySQL 2 创建所需要的表和数据3 创建Maven 工程、修改jdk4 通过pom.xml获取所需要的jar包5 安装Eclipse的MyBatis插件6 创建文件夹以及jsp文件7 创建下面各种java类…

MySQL集群高可用架构之MHA

MHA 一、MHA概述1.1 为什么要用MHA&#xff1f;1.2 什么是 MHA&#xff1f;1.3 MHA 的组成1.4 MHA 的特点1.5 故障切换备选主库的算法1.5 MHA工作原理 二、MySQL MHA高可用实例2.1 架构搭建部分1&#xff09;所有节点服务器安装MySQL2&#xff09;主从节点服务器添加域名映射3&…

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程&#xff0c;适用于我们要爬取的数据在网页源代码中出现&#xff0c;但是还是有很多的数据是源代码中没有的&#xff0c;需要通过接口访问服务器来获得&#xff0c;下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…