数据结构刷题篇 之 【力扣二叉树基础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);
}

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

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

完结撒❀

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

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

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

相关文章

【滑动窗口】Leetcode 最大连续1的个数 III

题目解析 1004. 最大连续1的个数 III 按照k的数值将0反转成1,记录数组中连续1的最长个数 算法讲解 我们需要一个变量temp记录翻转的次数,每遇到一次0,temp。当temp > k的时候此时说明翻转0已经到达极限,已经不可以在翻转了&…

基于二级片内硬件堆栈的后向CFI 验证方法研究,第三章

随着计算机技术的发展,针对计算机系统的恶意攻击越来越多,造成了巨大的经济损失。面向返回导向编程等恶意攻击方式通过修改堆栈中程序返回地址劫持控制流,达到恶意攻击的目的。后向控制流完整性即返回地址的完整性验证,是一种保护…

Tesla技术方案解析

Tesla技术方案解析 附赠自动驾驶学习资料和量产经验:链接 参考&部分摘选: EatElephant:解读: Tesla Autopilot技术架构 chenq100:TechTips - 031: “Tesla AI Day 2021”学习笔记 All you need to know about Tesla AI Da…

基于单片机的二维码LCD显示控制设计

**单片机设计介绍,基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…

蓝桥备赛——堆队列

AC code import os import sys import heapq a [] b [] n,k map(int,input().split())for _ in range(n):x,y map(int,input().split())a.append(x)b.append(y) q []# 第一种情况:不打第n个怪兽# 将前n-1个第一次所需能量加入堆 for i in range(n-1):heapq.h…

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的,这些摘抄下来用作沉淀学…

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

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

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型,和Seq2Seq不冲突。 …

STL —— vector(1)

博主首页: 有趣的中国人 专栏首页: C专栏 本篇文章主要讲解vector使用的相关内容 1. vector简介 vector 是 C 标准库中的一个容器类模板,它提供了动态数组的功能,可以方便地管理和操作元素的集合。下面是关于 vector 的一些基本信…

NRF24L01P和SI24R1的区别

NRF24L01无线模块广泛地运用于:无线门禁、无线数据通讯、安防系统、遥控装置、遥感 勘测、智能运动设备、工业传感器;平常我们用到的无线鼠标基本上采用的都是NORDIC的N RF24L01无线模块方案,而且,只需要一个5号电池即可。 几年前…

HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

介绍 本篇Codelab是基于画布组件、显式动画,实现的一个自定义抽奖圆形转盘。包含如下功能: 通过画布组件Canvas,画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件:堆叠容器&am…

详解TCP的三次握手和四次挥手

文章目录 1. TCP报文的头部结构2. 三次握手的原理与过程三次握手连接建立过程解析 3. 四次挥手的原理与过程四次挥手连接关闭过程的解析 4. 常见面试题 深入理解TCP连接:三次握手和四次挥手 在网络通信中,TCP(传输控制协议)扮演着…

人才推荐 | 材料化学博士,热衷于创新且可扩展的电池技术开发

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态,用科技解决职业领域问题,提升行业数字化服务水平,提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

java多线程——概述,创建方式及常用方法

前言: 学习到多线程了,整理下笔记,daydayup!!! 多线程 什么是线程 线程(Thread)是一个程序内部的一条执行流程。若程序只有一条执行流程,那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

【AIGC】如何在Windows/Linux上部署stable diffusion

文章目录 整体安装步骤windows10安装stable diffusion环境要求安装步骤注意事项参考博客其他事项安装显卡驱动安装cuda卸载cuda安装对应版本pytorch安装git上的python包Q&A linux安装stable diffusion安装anaconda安装cudagit 加速配置虚拟环境挂载oss(optional…

传播力研究期刊投稿发表

《传播力研究》杂志是经国家新闻出版总署批准,黑龙江日报报业集团主管主办,面向全国公开发行的学术刊物。本刊为新闻、传媒、传播学类专业院校师生、文化传播理论研究者和从业人员及爱好者,开展学术交流与研讨,汲取当今业界新鲜的…

RGB,深度图,点云和体素的相互转换记录

目录 1.RGBD2Point 1.2 步骤 2.Point2Voxel-Voxelization 2.1 原理 2.2 代码 3.Voxel2Point 4.Point2RGB 5.Voxel2RGB 1.RGBD2Point input:RGB D 内外惨 output:points cloud def depth2pcd(depth_img):"""深度图转点云数据图…

翻译 《The Old New Thing》 - Why is a registry file called a “hive“?

Why is a registry file called a “hive“?https://devblogs.microsoft.com/oldnewthing/20030808-00/?p42943 为什么注册表文件被称为‘蜂巢’? Raymond Chen 2003年8月8日 分享一个没用的知识: 话说有一位 Windows NT 的开发者十分讨厌蜜蜂。于是&a…

FLV流媒体封装格式

1、FLV 简介 FLV(Flash Video) 是 Adobe 公司推出的一种流媒体格式,由于其封装后的音视频文件体积小、封装简单等特点,非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用 FLV 格式封装的文件后缀为.flv。直播场景下拉流比较常见的是 http-…

计算机网络:现代通信的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…