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

news2024/12/25 9:30:29

 目录

一,对称二叉树

题目详情:

解题思路:

思路实现:

源代码:

二,另一颗树的子树

题目详情:

解题思路:

思路实现:

源代码:


 前言:

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

一,对称二叉树

题目详情:

给你一个二叉树的根节点 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.coloradmin.cn/o/1024601.html

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

相关文章

计算机视觉:从图像识别到深度学习

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 计算机视觉是人工智能领…

每日一面系列之volatile 的理解

volatile 是 Java 虚拟机提供的轻量级的同步机制&#xff0c;有三大特点&#xff1a;保证可见性&#xff1b;不保证原子性&#xff1b;禁止指令重排 保证可见性 当多个线程操作共享数据时&#xff0c;彼此是不可见的。由此提出 JMM &#xff08;java 内存模型&#xff09; J…

爬虫异常处理实战:应对请求频率限制和数据格式异常

作为一名资深的爬虫程序员&#xff0c;今天我要和大家分享一些实战经验&#xff0c;教你如何处理爬虫中的异常情况&#xff0c;包括请求频率限制和数据格式异常。如果你是一个正在进行网络爬虫开发的开发者&#xff0c;或者对异常处理感兴趣&#xff0c;那么这篇文章将帮助你更…

01强化学习的数学原理:大纲

01强化学习学习路线大纲 前言强化学习脉络图章节介绍Chapter 1&#xff1a;Basic ConceptsChapter 2&#xff1a;Bellman EquationChapter 3&#xff1a;Bellman Optimality EquationChapter 4&#xff1a;Value Iteration / Policy IterationChapter 5&#xff1a;Monte Carlo…

数据结构与算法--图

数据结构与算法--图 1 图的基本概念 2 无向图和有向图 3 图相关的关键术语 4 图的相关性质 5 图的存储 4.1 邻接表法 4.2 邻接矩阵法 6 图的代码表示 1 图的基本概念 图(Graph) 是由一个顶点集V和一个弧集E构成的网状数据结构&#xff0c;记作 G ( V , E ) G (V ,E…

RPC框架学习

一、设计目标 RPC 框架的目标就是让远程服务调用更加简单、透明&#xff0c;RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#xff09;、序列化方式&#xff08;XML/Json/ 二进制&#xff09;和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

多线程知识汇总

IntentService 多线程的应用在Android 开发中是非常常见的&#xff0c;常用方法主要有&#xff1a; 集成Thread类 实现Runnable接口 AsyncTask Handler HandlerThread IntentService IntentService 定义&#xff1a; Android 里的一个封装类&#xff0c;继承四大组件之一 ser…

Android 跨进程通信并传输复杂数据

前言 AIDL (Android Interface Definition Language) 支持以下数据类型&#xff1a; 基本数据类型&#xff1a;int、long、float、double、boolean、char、byte。 字符串类型&#xff1a;String。 集合类型&#xff1a;List、Map、Set。 Parcelable 类型&#xff1a;实现了 Par…

linux 文件锁

建议锁,强制锁,记录锁的概念 建议锁&#xff1a; 如果某一个进程对一个文件持有一把锁之后&#xff0c;其他进程仍然可以直接对文件进行操作(open, read, write)而不会被系统禁止&#xff0c;即使这个进程没有持有锁。只是一种编程上的约定。建议锁只对遵守建议锁准则的进程生…

@JsonFormat、@JSONField、@DateTimeFormat详细解说

JsonFormat、JSONField、DateTimeFormat详细解说_jsonfield format_xinlianluohan的博客-CSDN博客 三者出处 1、JsonFormat来源于jackson&#xff0c;Jackson是一个简单基于Java应用库&#xff0c;Jackson可以轻松的将Java对象转换成json对象和xml文档&#xff0c;同样也可以…

CSS SASS calc() 计算表达式或使用变量

calc&#xff08;&#xff09;是css的一个函数&#xff0c;可用于元素计算长度&#xff0c;比如div宽度想要减去一个固定宽度后并自适应&#xff0c;可以写为calc(100% - 60px) 注意“-”两边有空格 sass已经是常用的预编译语言&#xff0c;允许使用变量等规则&#xff0c;如果…

上海亚商投顾:沪指窄幅震荡微跌 两市成交金额创年内新低

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指盘中跌超1%&#xff0c;黄白二线有所分化。华为星闪概念股午后拉升&…

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构 1&#xff0e;N26接口是MME和5GS AMF之间的CN间接口&#xff0c;以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的&#xff0c;用于互通。N26支持在S10上支持的功能的子集&#xff08;对于互通是必要的&#xff09;。 2&#xf…

面试题:HTTPS 是如何保证传输安全的?又被问了!

文章目录 1. HTTP 协议1.1 HTTP 协议介绍1.2 HTTP 中间人攻击1.3 防止中间人攻击 2. HTTPS 协议2.1 HTTPS 简介2.2 CA 认证体系 总结 1. HTTP 协议 在谈论 HTTPS 协议之前&#xff0c;先来回顾一下 HTTP 协议的概念。 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&…

Android13 大屏设备底部显示TaskBar并NavagatonBar居右

Android 13大屏设备时底下显示任务栏以及虚拟按键靠右的问题&#xff0c; 当前需求是去掉底部任务栏的显示&#xff0c;并把虚拟按键导航栏居中显示。 修改前的效果&#xff1a; 修改后的效果&#xff1a; 通过查看源码逻辑&#xff0c;可以发现只需把isTablet相关的逻辑和…

Mybatis 映射器中映射方法接受多个参数(@Param)

前面我们介绍了使用Mybatis映射器进行数据的增删改查操作&#xff1b;本篇我们继续介绍在Mybatis映射器的映射方法中如何使用多个参数。 如果您对Mybatis使用映射器进行数据的增删改查操作不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; …

【数据结构】二叉树的构建与基本操作实现

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.前序建立二叉树 2.销毁二叉树 3.统计 …

uni-app 之 picker选择器

uni-app 之 picker选择器 同步滚动&#xff1a;开 uni-app 之 picker选择器 一、普通选择器 二、多列选择器 三、时间选择器 四、日期选择器 一、普通选择器 <template><view><picker change"bindPickerChange" :value"index" :range&q…

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理

LabVIEW开发航天器模拟器的姿态控制和反作用轮动量管理 在过去十年中&#xff0c;航天器一直是现代技术进步的先决条件。迄今为止&#xff0c;为了更好地完成各种实际任务&#xff0c;已经在航天器姿态控制领域进行了大量研究。航天器一旦进入太空&#xff0c;就容易出现不确定…

JavaWeb开发-05-SpringBootWeb请求响应

一.请求 1.Postman 2.简单参数 ​ package com.wjh.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/** 测试请求参数接受*/ R…