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

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

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

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

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

完结撒❀

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NFT Insider #125:Astar将与索尼开发的新公链将关注游戏或 NFT 等众多领域

引言:NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜…

【C语言】——指针六:冒泡排序与qsort函数的实现

【C语言】——指针六:冒泡排序与qsort函数 一、冒泡排序1.1、冒泡排序的原理1.2、用代码实现冒泡排序 二、qsort函数2.1、qsort函数的定义2.2、 qosrt函数的使用(1)比较函数的写法(2)使用 q s o r t qsort qsort 函数…

Linux 常用命令(1)

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:Linux 随笔集合 …

NetCore3.1 Controller中直接返回JObject对象抛出异常解决方案

问题描述 在NetCore 3.1的Web项目中,Controller有一个方法直接返回JObject对象时,抛出了异常 S y s t e m . N o t S u p p o r t e d E x c e p t i o n : T h e c o l l e c t i o n t y p e ′ N e w t o n s o f t . J s o n . L i n q . J O b j …

2024/3/29 IOday2

所有人&#xff0c;今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fpfopen("./rising_free…

<QT基础(4)>QLabel使用笔记

Label 前面的文章里面把QLabel批量引入ScrollArea作为预览窗口&#xff0c;这篇把图像填充到QLable的PixelMap展示指定图像。 参数设置 设置QLabel的大小格式 QWidget* widget new QWidget; widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); widget->…

千川素材投放效果如何追踪:精准识别爆款、潜力、首发、优质素材

在数字营销和广告领域&#xff0c;素材投放的效果直接关乎广告的成功与否。为了在竞争激烈的市场中脱颖而出&#xff0c;广告主和广告从业者需要密切关注素材投放效果&#xff0c;并及时识别出不同类型的素材&#xff0c;如爆款、潜力、首发和优质素材。本文将详细探讨如何进行…

慧天【HTWATER】:水文水动力模型的革命性工具,城市内涝的精准解决方案

城市内涝水文水动力模型介绍 在城市排水防涝规划过程中&#xff0c;水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面&#xff0c;内涝耦合模型提供了相应的模拟及分析工具&#xff1a; 1.1丰富的数…

Docker安装xxl-job并整合到SpringBoot项目

1. 创建数据库 执行如下SQL语句创建相关表 CREATE database if NOT EXISTS xxl_job default character set utf8mb4 collate utf8mb4_general_ci; use xxl_job;SET NAMES utf8mb4; CREATE TABLE xxl_job_info (id int(11) NOT NULL AUTO_INCREMENT,job_group int(11) NOT NUL…

分享几个以前画过的pcb,确实能看到进步

本文来自看海原创视频教程&#xff1a;《运放秘籍》运算放大器基础精讲及应用第一部*开天 微信公众号&#xff1a;工程师看海 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘籍_运算放大器Multisim仿真视频教程第一部开天_工程师看海」 点击链接直接打开 …

【多线程系列】你先说说synchronized的实现原理

面试官&#xff1a;听说你精通多线程&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以贴近现实的【面试官面试】形式来分享技术&#xff0c;本期是《多线程系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1…

SpringBoot Redis的使用

官方文档&#xff1a; 官方文档&#xff1a;Spring Data Redis :: Spring Data Redis 和jedis一样&#xff0c;SpringBoot Redis 也可以让我在Java代码中使用redis&#xff0c;同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

【Flink】Flink 处理函数之基本处理函数(一)

1. 处理函数介绍 流处理API&#xff0c;无论是基本的转换、聚合、还是复杂的窗口操作&#xff0c;都是基于DataStream进行转换的&#xff0c;所以统称为DataStreamAPI&#xff0c;这是Flink编程的核心。 但其实Flink为了更强大的表现力和易用性&#xff0c;Flink本身提供了多…

Matlab与数学计算

原文地址&#xff1a;Matlab与数学计算 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇笔记。主要用于介绍MatLab的作用以及其作为数学工具的使用方法。 目的是总结学校课件复习自用&#xff0c;但是不可能像相关的书籍那么系统全面&#xff0c;力求简单明了。都…

书生·浦语大模型全链路开源体系-第1课

书生浦语大模型全链路开源体系-第1课 书生浦语大模型全链路开源体系-第1课相关资源课程笔记技术报告笔记 书生浦语大模型全链路开源体系-第1课 为了推动大模型在更多行业落地应用&#xff0c;让开发人员更高效地学习大模型的开发与应用&#xff0c;上海人工智能实验室重磅推出书…

SD-WAN与边缘计算的结合:开启网络性能

随着数字化转型的加速和云计算技术的发展&#xff0c;企业对网络性能和可靠性的需求越来越高。SD-WAN&#xff08;软件定义广域网&#xff09;和边缘计算作为两项重要的技术趋势&#xff0c;在提高网络性能和效率方面发挥着至关重要的作用。本文将探讨SD-WAN与边缘计算的结合如…

linux使用GDB调试段错误

前因&#xff1a;由于在做线程邮箱项目的过程中&#xff0c;遇到了段错误&#xff0c;情况如下&#xff1a; 代码量达到了500多行&#xff0c;使用打印难以实现&#xff0c;试着用GDB调试段错误。 调试过程&#xff1a; 1、使用gcc ./a.out -g 使用加-g来生成调试文件core …

三菱Q系列PLC以太网TCP通讯FB块源码

三菱Q系列PLC的tcp通讯&#xff0c;客户端和服务器两个变量好用的FB块&#xff0c;调用块就可以实现通讯连接&#xff0c;不需要自己写程序&#xff0c;简单配置引脚就可以。该块还集成了断网&#xff0c;连接错误&#xff0c;发送接收数据错误报警等功能。具体功能见下面介绍.…

【linux】基础IO |文件操作符

需要掌握&#xff1a;操作文件&#xff0c;本质&#xff1a;进程操作文件。进程和文件的关系 向文件中写入&#xff0c;本质上向硬件中写入->用户没有权利直接写入->操作系统是硬件的管理者&#xff0c;我们可以通过操作系统往硬件写入->操作系统必须提供系统调用&…