当前位置: 首页 > news >正文

【树】你真的会二叉树了嘛? --二叉树LeetCode专题

 

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

本章记录下目前刷到的二叉树的各类题型,做一个总结。一起来学习吧!

对二叉树还不熟悉的同学,可以看看我之前发的关于二叉树的文章哦 二叉树专题

话不多说 开始吧!

目录

题目:144. 二叉树的前序遍历

题解:

代码实现:

题目:222. 完全二叉树的节点个数

题解:

代码实现:

题目:剑指 Offer 28. 对称的二叉树

题解:

代码实现:

题目:226.翻转二叉树

题解:

代码实现:

题目:104. 二叉树的最大深度

题解:

代码实现:

题目:965. 单值二叉树

 ​编辑

题解:

代码实现:

题目:100.相同的树

题解:

代码实现:

完结撒花:

 

题目:144. 二叉树的前序遍历

 

题解:

先来一题简单的题目练练手,之前有提到过,二叉树的前序遍历就是通过根左右的遍历方式来进行的,所以这题总体思路也是一样.不过要说明的是,这里采用了c语言,所以输出时需要自己创建一个动态数组,每次将访问到的val存入动态数组当中即可.

(中后序大致相同,改变的仅为访问节点的时间,所以这里就不过多赘述)

代码实现:

struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};
int checksize(struct TreeNode *root)
{return root==NULL?0:checksize(root->left)+checksize(root->right)+1;
}
void preorder(struct TreeNode* root,int *a,int *pi)
{if(root==NULL){(*pi)++;return;}a[(*pi)++]=root->val;preorder(root, a, pi);preorder(root, a, pi);return;
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){*returnSize=checksize(root);int *a=(int *)malloc(sizeof(int)* *returnSize);preorder(root,a,0);return a;
}

题目:222. 完全二叉树的节点个数

题解:

这题虽然被标注为了中等题,但我认为知道二叉树的本质之后,其充其量为一个简单题,并且有秒杀的方法

依照样例,这棵树应该长这样

 

我们要做的就是统计其本身节点数与其左右树的节点数

例如2要返回给上一层的就是3(左节点一个,右节点一个,加上自己)

而4这个节点要返回给上层的就是1(左节点无 右节点无 仅有一个自己)

所以很容易看出来 若有节点则返回1+左右子树.若无节点则直接返回0

 这样一层层递归后,1节点收到的就是其左右子树的和,最后返回给答案的就是1+左右子树和

这里给出两种代码,第一种是将每一步分开来了,若这层为空 则size不变,若不为空,则size++继续遍历左右子树(比较像前序遍历)

代码实现:

#include<iostream>
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;};int TreeSize(struct TreeNode* root,int size)
{if (root == NULL)return size;size++;size=TreeSize(root->left,size);size=TreeSize(root->right,size);return size;
}
int countNodes0(struct TreeNode* root){return TreeSize(root,0);
}
//
int countNodes(struct TreeNode* root){return root==NULL?0:countNodes(root->left)+countNodes(root->right)+1;
}

题目:剑指 Offer 28. 对称的二叉树

题解:

镜像对称无非就是判断,其延中线对折这棵树,能否重叠.也就是根的左右子树是否完全相同

先分情况来讨论:

若两个节点都为空,则肯定相同 也就是p==NULL&&q==NULL

其中一个为空另一个不为空,则肯定不同 p==NULL||q==NULL

之后再判断两个节点的val是否相等,若相等则true,否则返回false p->val==q->val

以单个节点的视角来看,情况只有这么多,之后我们就可以开始进入递归来判断了,分别访问其左右子树,我们需要的只是知道他最后返回的是true还是false,因为单个节点的情况都被我们判断完了

每一个节点都可以看为单个节点

代码实现:

bool check(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 check(p->left,q->right)&&check(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){return check(root->left,root->right);
}

题目:226.翻转二叉树

题解:

依旧从一个节点的角度来看,假设只有一个这样的二叉树,我们要做的就是

将其左右子树进行调换即可.也就是找到其左子树与右子树.拿一个中间变量,进行交换(类似两数调换)

现在我们要做的是考虑一下递归停止的情况,老样子 若根为NULL,则返回空,若不是则返回其根节点.(根节点此时为已经交换完的子树 之后再将两个根节点进行调换即可达到镜像

代码实现:

#include<iostream>
using namespace std;
struct TreeNode {int val;TreeNode *left;TreeNode *right;};class Solution {
public:TreeNode* mirrorTree(TreeNode* root) {if(root==NULL)return NULL;TreeNode* left=mirrorTree(root->left);TreeNode* right=mirrorTree(root->right);root->left=right;root->right=left;return root;}
};

题目:104. 二叉树的最大深度

题解:

这题和节点个数的那题有点类似,不过其多了一个属性,要取最大值.

依旧先设定返回的规则,若为空则返回0.

之后遍历左子树的深度.再遍历右子树的深度,返回其最大值+1即可

这里虽然也可以秒杀,但是没有必要了,让人能看懂的代码才是一段好的代码.

代码实现:

int maxDepth(struct TreeNode* root){if(root==NULL)return 0;int left=maxDepth(root->left);int right=maxDepth(root->right);return left>right?left+1:right+1;
}

题目:965. 单值二叉树

 

题解:

这题也很简单,先判断该节点是否为空,若为空则肯定是单值,返回true

之后与其左右节点作比较,若不同则返回false

代码实现:

bool isUnivalTree(struct TreeNode* root){if(root==NULL)return true;if(root->left&&root->left->val!=root->val)return false;if(root->right&&root->right->val!=root->val)return false;return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

题目:100.相同的树

 

题解:

依旧先处理初始情况(与镜像大致相同,仅遍历顺序不同)

若两个节点都为空,则肯定相同 也就是p==NULL&&q==NULL

其中一个为空另一个不为空,则肯定不同 p==NULL||q==NULL

之后再判断两个节点的val是否相等,若相等则true,否则返回false p->val==q->val

之后在遍历其左右子树即可

代码实现:

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

完结撒花:

🌈本篇博客的内容【】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

相关文章:

【树】你真的会二叉树了嘛? --二叉树LeetCode专题

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数

本期给大家带来的是是《LeetCode 热题 HOT 100》第四题——寻找两个正序数组的中位数的题目讲解&#xff01;&#xff01;&#xff01;&#xff08;&#xff09; 本文目录 &#x1f4a5;题意分析 &#x1f4a5;解题思路&#xff1a; 1、直接法 &#xff08;❌&#xff09; …...

Unity- 游戏结束以及重启游戏

文章目录游戏结束以及重启游戏建个游戏结束页面编写委托类 游戏主角 以及 ui管理类的脚本重启游戏游戏结束以及重启游戏 思路&#xff1a;利用Canvas创建好覆盖全屏的结束页面&#xff0c;默认关闭。游戏结束时&#xff0c;玩家控制的对象发起委托&#xff0c;ui管理收下委托&…...

NGK BeCu8·11铜合金板材

NGK BeCu811铜合金板材 CB498K、CuSn6Zn4Pb2-B、CC498K、CuSn6Zn4Pb2-C CB494K、CuSn5Pb9-B、CC494K、CuSn5Pb9-C CB495K、CuSn10Pb10-B、CC495K、CuSn10Pb10-C CB496K、CuSn7Pb15-B、CC496K、CuSn7Pb15-C CB497K、CuSn5Pb20-B、CC497K、CuSn5Pb20-C 日本古河连接器专用材料如:…...

电脑突然死机怎么办?正确做法在这!

案例&#xff1a;电脑突然死机怎么办&#xff1f; 【家人们&#xff0c;我刚刚正在做工作报告&#xff0c;突然间电脑就死机了&#xff0c;这可怎么办啊&#xff1f;有什么方法可以快速解决这个问题吗&#xff1f;急急急&#xff01;】 电脑在使用过程中&#xff0c;有时会出…...

基于cell数组的MATLAB仿真(附上完整仿真源码)

MATLAB是一款强大的数学软件&#xff0c;它提供了许多数据结构来存储和处理数据。其中&#xff0c;cell数组是一种非常有用的数据结构&#xff0c;它允许在一个数组中存储不同类型的数据&#xff0c;包括数值、字符串、逻辑值和其他cell数组等。 文章目录简单代码完整仿真源码下…...

电脑蓝屏问题排查

最近电脑安装了最新win10&#xff0c;更新最新的驱动以后&#xff0c;开机几分钟后&#xff0c;会蓝屏重启&#xff0c;报错为&#xff1a; DRIVER_POWER_STATE_FAILURE 下载蓝屏分析工具BlueScreenView 问题出在ntoskrnl.exe bing搜索给出了二种解决方案&#xff1a; 1&a…...

SpringBoot配置slf4j + logback

文章目录日志体系结构在SpringBoot中使用slf4j logback日志框架四种常用的日志输出1. ConsoleAppender2. FileAppender3. RollingFileAppender之TimeBasedRollingPolicy4. RollingFileAppender之SizeAndTimeBasedRollingPolicy日志过滤1. 级别介绍2. 过滤节点filter介绍Spring…...

JAVA——网络编程基本概念

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…...

[JavaEE]----Spring02

文章目录Spring_day021&#xff0c;IOC/DI配置管理第三方bean1.1 案例:数据源对象管理1.1.1 环境准备1.1.2 思路分析1.1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序1.1.4 实现C3P0管理步骤1:导入C3P0的依赖步…...

笔记本可自行更换CPU、独显了,老外用它手搓了台“PS5”

前面说到微软打算在 Win12 出来前搞出个模块化的Windows&#xff1a;下一个系统不是Win12&#xff0c;微软要复活Win10X。 模块化不用小蝾再过多介绍了&#xff0c;就像积木一样拼在一起组成一个整体。 优势就很明显了&#xff0c;由于每个部分都是单独的模块&#xff0c;更新…...

Linux uart驱动框架

Linux内核提供了标准的UART驱动程序&#xff0c;可以通过以下步骤编写&#xff1a; 首先需要定义一个结构体来存储串口设备数据。在该结构体中&#xff0c;包含一个uart_port结构体&#xff0c;用于与Linux内核通信&#xff0c;并包含一些设备特定的数据&#xff08;例如波特率…...

第一个禁止ChatGPT的西方国家

意大利成为第一个有效禁止 ChatGPT 的西方国家。 由于可能违反隐私和数据法&#xff0c;该国的数据监管机构已下令开发聊天机器人的 OpenAI 停止运营。 意大利数据保护局 (GPDP) 提到了一些担忧&#xff0c;包括大量收集用户数据和存储以训练 AI 算法。 ChatGPT 是一种大型语…...

Web 攻防之业务安全:Session会话注销测试.

Web 攻防之业务安全&#xff1a;Session会话注销测试. 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务所…...

4月最新编程排行出炉,第一名ChatGPT都在用~

作为一名合格的&#xff08;准&#xff09;程序员&#xff0c;必做的一件事是关注编程语言的热度&#xff0c;编程榜代表了编程语言的市场占比变化&#xff0c;它的变化更预示着未来的科技风向和机会&#xff01; 快跟着一起看看本月排行有何看点&#xff1a; 4月Tiobe排行榜前…...

生成不保存在服务器的附件,并以附件形式发送邮件

需求&#xff1a;从数据库中抓取需要的数据&#xff0c;将数据生成excel表格&#xff0c;并将此表格以附件的形式放置到邮件中发送 //发送带附件的邮件&#xff0c;同时附件不会生成到服务器中public static String sendFileEmail(String form, String code, String to, String…...

Golang Gin框架HTTP上传文件

Golang Gin框架HTTP上传文件解析 文章目录Golang Gin框架HTTP上传文件解析HTTP上传的文件的原理Gin框架文件上传Demo限制文件上传的大小文件类型验证文件上传进度-后台计算文件上传进度HTTP上传的文件的原理 HTTP协议的文件上传是通过HTTP POST请求实现的&#xff0c;使用mult…...

BM36-判断是不是平衡二叉树

题目 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是一棵空…...

Quartz 单例定时任务

1、引入jar包&#xff0c;继承 Job 接口&#xff0c;编写需要执行的业务逻辑 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency> public class D…...

不要告诉同事你要离职!打算跳槽,新公司开出两倍薪资,私下告诉要好的同事,却被同事出卖给领导!...

职场上有真正的朋友吗&#xff1f;来看看这位网友的讲述&#xff1a;一位前同事本来打算跳槽&#xff0c;新公司开出的薪资是原来的两倍。她私下告诉了几位同事自己打算离职的消息&#xff0c;并跟同事们分享了工资翻倍的喜悦。可她万万没想到&#xff0c;两天之后的公司会议上…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...