数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

news2024/11/26 8:50:19

在这里插入图片描述有没有一起拼用银行卡的,取钱的时候我用,存钱的时候你用

1、相同的树

难度等级:⭐
直达链接:相同的树

2、单值二叉树

难度等级:⭐
直达链接:单值二叉树

3、对称二叉树

难度等级:⭐⭐
直达链接:对称二叉树

4、二叉树的前序遍历

难度等级:⭐⭐⭐
直达链接:二叉树的前序遍历

5、另一颗树的子树

难度等级:⭐⭐⭐⭐
直达链接:另一颗子树
–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

1、相同的树

直达链接:相同的树
题目:
在这里插入图片描述解题思路:

判断两个二叉树是否相同,而二叉树又分为根和左右子二叉树,左右子二叉树也可以再分(有的话),即需要判断根是否相同,相同再继续比较左右子树,比较左右子树也是需要判断根是否相同,相同的话继续向下比较,这就比较适合用递归来进行解题。

那么下面我们就需要找最小子问题,也就是判断递归终止的条件,这里我们需要考虑到空指针的问题

1.传过来的两个形参可能都是空指针,那么直接返回true

2.而也可能有一个为空,那么就返回false

3.两个都不为空比较数值是否相等即可

解题代码:

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);
}

这里以下面两个二叉树给大家进行代码递归图解,其他的大家可以自行动手,有利于加深理解
在这里插入图片描述代码递归图解:
在这里插入图片描述

2、单值二叉树

直达链接:单值二叉树
题目:
在这里插入图片描述解题思路:

这道题并不难,还是依照老套路进行递归遍历,比较根和子节点的值,不相等就返回false,相等就继续想向下进行递归(有的话),再比较根和子节点。。。

那么我们还需要考虑一个递归最小子问题,所传的形参为空指针的情况,形参为空指针也分两种情况:

1.开始所传的就是空指针
2.递归到叶节点的子节点

这两种情况都直接返回true即可。

解题代码:

bool isUnivalTree(struct TreeNode* root) {

    //根为空
    if(root == NULL)
    {
        return true;
    }

    //根不为空
    if(root->left && root->val != root->left->val)
    {
        return false;
    }

    if(root->right && root->val != root->right->val)
    {
        return false;
    }
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

我们以下面二叉树举例进行递归图解:
在这里插入图片描述

代码递归图解:
在这里插入图片描述方块表示调用该函数在内存上所开辟的空间,圆表示访问子节点的数值。

3、对称二叉树

直达链接:对称二叉树
题目:
在这里插入图片描述解题思路:

这道OJ题读完题目再看所给的函数接口大家可能就一头雾水了。
函数中所传的形参只有一个二叉树的指针。
而我们要进行对称判断的话是必须左右子树同时进行递归到相应位置节点判断节点是否相等。
这就有点难办了,同学可以先思考如何进行解决

假如已经进入到二叉树的两个子树判断,这里就和判断相同二叉树一样了

1.两个根节点都为空返回true
2.只有一个为空返回false
3.都不为空判断是否相等

解题代码:

bool is_Symmetric(struct TreeNode* left,struct TreeNode* right)
{
    //为空情况
    if(left == NULL && right == NULL)
    {
        return true;
    }

    if(left == NULL || right == NULL)
    {
        return false;
    }
    
    //不为空
    if(left->val != right->val)
    {
        return false;
    }
    
    return is_Symmetric(left->left,right->right) && is_Symmetric(left->right,right->left);
}

bool isSymmetric(struct TreeNode* root) {
    return is_Symmetric(root->left,root->right);
}

看到代码想必大家已经恍然大悟了
我们可以再创造一个函数将root的左右节点作为实参进行传递,这样就解决只有一个根节点指针的问题了

到is_Symmetric函数中实现逻辑与上面题相同的树就一样了,这里就不再进行递归图解了

4、二叉树的前序遍历

直达链接:二叉树的前序遍历
题目:
在这里插入图片描述解题思路:

对于前序遍历在我之前的博客中已经讲到过,认真学习了的话对于前序遍历大家应该是小菜一点的

这题对第一次做的同学主要难的有两点:
1.对于解题框中preorderTraversal函数所传的实参int returnSize不知道什么意思
2.如何将前序遍历存入到一个数组中
*

解题代码:

//计算树的节点
int Treesize(struct TreeNode* root)
{
    return root == NULL ?0 :  Treesize(root->left)+Treesize(root->right)+1;
}

void preorder(struct TreeNode* root,int*arr,int* i)
{
    if(root == NULL)
    {
        return;
    }

    arr[(*i)++] = root->val;
    preorder(root->left,arr,i);
    preorder(root->right,arr,i);
}

 //return Size 返回数组的个数
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    (*returnSize) = Treesize(root);
    
    int* arr = (int*)malloc(sizeof(int)*(*returnSize));

    int i = 0;
    preorder(root,arr,&i);
    
    return arr;
}

代码讲解:

看了代码大家就会知道,returnSize其实是指所开辟数组空间数据的个数,这是力扣中写题的一贯格式,返回一个数组必须计算出其对应的空间大小。

对于如何将前序遍历存储到数组中我们看了代码我想大家就会明白,而这里需要注意的一点的访问数组的下标变量i使用的是地址,而不是数值,因为在调用函数前序遍历存储到数组中存储一个数据,下标i是需要加1往后进行移动的,而如果传数值进行下标的访问可能会出现在同一个下标位置多次存储的BUG,其原因就是形参只是实参的一份临时拷贝,而要想真正访问到实参所对应的数值就需要传指针进行解引用。

5、另一颗树的子树

直达链接:另一颗子树
题目:
在这里插入图片描述解题思路:

这题看似没有头绪,其实也不难
在判断是否含有子树时,我们可以直接调用之前写过的相等的树的题解(是不是恍然大悟😁)
那么我们需要判断的只有当root的节点值与subRoot的节点值相等时,直接进入判断当前子树与subRoot是否相等即可。
当然当递归到二叉树的叶子节点之后为空节点时说明root中不含有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(root->val == subRoot->val && isSameTree(root,subRoot))
    {
        return true;
    }

    return isSubtree(root->left,subRoot)
       || isSubtree(root->right,subRoot);
}

我们以下面例子为大家进行递归图解:
在这里插入图片描述

递归图解:
在这里插入图片描述注意最后判断对错用的||
大家可以跟着逻辑捋一遍逻辑(做完图才发现不能显示完整😭,上面递归图解逻辑是从中间开始的大家也可以自己手动绘个图)

完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤
在这里插入图片描述

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

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

相关文章

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面:**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境(IDE)和Object Pascal语言进行软件开发时,采用…

vivado 器件编程

生成器件镜像后 , 下一步是将其下载到目标器件。 Vivado IDE 具有内置原生的系统内器件编程功能用于执行此操作。 Vivado Design Suite 和 Vivado Lab Edition 都包含相应的功能 , 支持您连接到包含 1 个或多个 FPGA 或 ACAP 的硬 件, 以…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。…

使用Docker Compose一键部署前后端分离项目(图文保姆级教程)

一、安装Docker和docker Compose 1.Docker安装 //下载containerd.io包 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm //安装依赖项 yum install -y yum-utils device-mapper-persistent-data l…

VTK 9.2.6 源码和VTK Examples 编译 Visual Studio 2022

对于编译 VTK 源码和编译详细的说明: VTK 源码编译: 下载源码: 从 VTK 官方网站或者 GitHub 获取源代码。官网目前最近的9.3.0有问题,见VTK 9.3.0 编译问题 Visual Studio 2022去gitlab上选择9.2.6分支进行clone CMake 配置&…

探索数据结构:链式队与循环队列的模拟、实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 队列的定义 队列(queue)是一种只允许在一端进…

系统分析师-参考模型

前言 网络术语中的参考模型指的是OSI参考模型,由ISO(国际标准化组织)制定的一套普遍适用的规范集合,以使得全球范围的计算机平台可进行开放式通信。 ISO创建了一个有助于开发和理解计算机的通信模型,即开放系统互联OS…

openwrt 编译mysql数据库固件,并调用

前言 openwrt 编译源码mysql数据库,并编写demo调用 一、整体架构设计 作者要做一个项目,没有后端服务,只有一个电脑,需要在电脑上安装mysql服务端。然后在设备上安装mysql客户端。 二、PC安装mysql 1.官网链接 自行百度安装&a…

一文彻底搞懂spring循环依赖

文章目录 1. 什么是循环依赖2. Spring怎么解决循环依赖3. 无法处理的循环依赖 1. 什么是循环依赖 Spring 中的循环依赖是指两个或多个 Bean 之间相互依赖,形成一个循环引用的情况。在 Spring 容器中,循环依赖通常指的是单例(Singleton&#…

使用 Idea 快速搭建 SpringMVC 项目的详细步骤

一、开篇 SpringMVC 是一款当下流行的优秀的 MVC 框架,关于 MVC 的概念、作用、优点等内容介绍,在作者之前的一篇 Chat 《深入理解 MVC 框架原理:自定义 Struts2 框架》中有详细的描述。描述了关于另一款主流 MVC 框架的原理介绍,…

Docker-Container

Docker ①什么是容器②为什么需要容器③容器的生命周期容器 OOM容器异常退出容器暂停 ④容器命令清单总览docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker container insp…

unrealbuildtool 无法找到,执行 Generate Visual Studio Project 错误

参考链接 Generate cpp project Couldnt find UnrealBuildTool - Pipeline & Plugins / Plugins - Epic Developer Community Forums (unrealengine.com) 错误提示如下图: 解决方案: 打开 UnrealBuildTool,生成解决方案就可以了

学习Fast-LIO系列代码中相关概念理解

目录 一、流形和流形空间(姿态) 1.1 定义 1.2 为什么要有流形? 1.3 流形要满足什么性质? (1) 拓扑同胚 (2) 可微结构 1.4 欧式空间和流形空间的区别和联系? (1) 区别: (2) 联系: 1.5 将姿态定义在流形上比…

【Python实用标准库】argparser使用教程

argparser使用教程 1.介绍2.基本使用3.add_argument() 参数设置4.参考 1.介绍 (一)argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,其用主要在两个方面: 一方面在python文件中可以将算法参数集中放到一起&#x…

CavalierContours 二维线操作

CavalierContours 二维线操作 2D polyline library for offsetting, combining, etc. 用于偏移、交并补等组合等操作的 2D 多折段线库。 Polyline Structure 多段线结构 Polylines are defined by a sequence of vertexes and a bool indicating whether the polyline is cl…

关系型数据库mysql(7)sql高级语句①

目录 一.MySQL常用查询 1.按关键字(字段)进行升降排序 按分数排序 (默认为升序) 按分数升序显示 按分数降序显示 根据条件进行排序(加上where) 根据多个字段进行排序 ​编辑 2.用或(or&…

【C语言】内存函数(memmove)的使用和模拟实现

目录 前言memmove定义1.在cplusplus中的定义 memmove的模拟实现1、思路2、难点3、解决方法 模拟实现代码 前言 这篇文章讲述了memcpy的使用、模拟实现和一个未解决的问题内存函数(memcpy)的使用和模拟实现 当我们使用我们模拟的my_memcpy拷贝,当源拷贝地址与目标拷…

C语言编译与链接

前言 我们想一个问题,我们写的C语言代码都是文本信息,电脑能直接执行c语言代码吗?肯定不能啊,计算机能执行的是二进制指令,所以将C语言转化为二进制指令需要一段过程,这篇博客讲一下编译与链接,…

ISAC代码仿真学习笔记

文章目录 A. MIMO Communication ModelB. MIMO Radar Model III. Joint Waveform and Phase Shift Matrix Design for Given Radar BeampatternA. Problem FormulationB. Proposed Algorithm IV. JOINT DESIGN WITH TRADE-OFF BETWEEN RADAR AND COMMUNICATION PERFORMANCEA. P…

boost::asio::ip::tcp/udp::socket::release 函数为什么限制 Windows 8.1 才可以调用?

如本文题目所示,这是因为只有在 Windows 8.1(Windows Server 2012 RC)及以上 Windows 操作版本才提供了运行时,修改/删除完成端口关联的ABI接口。 boost::asio 在 release 函数底层实现之中是调用了 FileReplaceCompletionInform…