《LeetCode》——LeetCode刷题日记

news/2024/9/13 20:56:41/

本期,将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。

目录

(一)606. 根据二叉树创建字符串

💥题意分析 

💥解题思路

(二)102. 二叉树的层序遍历

💥题意分析

💥解题思路

(三)236. 二叉树的最近公共祖先

 💥题意分析

💥解题思路


(一)606. 根据二叉树创建字符串

首先,第一道题是关于 二叉树创建字符串的题,接下来我将一步步的分析带大家理解这道题!

题目如下 :👇

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

 

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

💥题意分析 

首先,我们还是先对题意进行简单的分析:

我们可以发现他不是把所有的输出都给用括号括起来,仔细观察发现而是有些直接省略了,具体省略的有以下几种情况:

  • 1、左右都为空——省略
  • 2、左为空,右不为空——不省略
  • 3、右为空,左不为空——省略

但是大家仔细观察可以发现,此时当我们按照上述方式去看示例时,发现跟题意对不上。个人觉得应该是题当时弄错了,本题的整体思路就如上述,具体应该如下才对:

  • 总之大概意思就是根据题意给出的二叉树的,我们按照合适的输出方案输出即可

💥解题思路

具体思路如下:

我们可以使用递归的方法得到二叉树的前序遍历,并且每次递归时加上相应的括号即可得到最终的结果。

  • 1、如果当前节点没有孩子(即左右都为空),此时则不需要在节点后面加上任何括号;

  • 2、如果当前节点只有左孩子,而右为空。那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号;

  • 3、对应的,如果当前节点只有右孩子,而左为空。那当我们在递归时,此时的括号就不难省略了。此时需要先加上一层空的括号表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。

 💥代码展示:

class Solution {
public:string tree2str(TreeNode* root) {if(root == nullptr)return "";//root->val不支持转成整形,因此这里加上to_string 即可实现转成字符串string str=to_string(root->val);//左为空,此时我们不能直接省略,还要看右边的情况if(root->left || root->right){str+="(";str+=tree2str(root->left);str+=")";}if(root->right){str+="(";str+=tree2str(root->right);str+=")";}return str;}
};
  • 最终结果:

 


(二)102. 二叉树的层序遍历

题目如下 :👇

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

💥题意分析

  • 本题的意思其实很简答,就是根据给出的二叉树,我们相当于层序遍历之后输出最后的结果即可!

💥解题思路

在这里我给出两种思路供大家参考:

1、我们定义两个队列。

  • 一个队列控制结点的指针,然后去控制层序遍历;
  • 另外一个队列则为一个整形,控制层数,即此时是第几层的在进行操作。

图解:

 2、我们只定义一个队列。

我们也可以定义一个队列进行操作:

此时我们还需要在定义一个变量,设为【levelsize】。目的是为了控制二叉树一层一层的出;

图解:


 

 💥代码展示:

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> str;int levelsize=0;if(root){str.push(root);levelsize=1;}//控制每层的元素出队列vector<vector<int>>arry;while(!str.empty()){vector<int>v;//levelsize 为几就表示需要出几次while(levelsize--){//先取对头的数据TreeNode* front=str.front();str.pop();v.push_back(front->val);//左不为空,把元素入队if(front->left)str.push(front->left);//右不为空,把元素入队if(front->right)str.push(front->right);}//每层出的元素放到相应的数组中arry.push_back(v);levelsize=str.size();}return arry;}
};
  • 最终结果:



(三)236. 二叉树的最近公共祖先

题目如下 :👇

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

 

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

 

 💥题意分析

  • 本题的大概意思就是题中给出两个节点,在二叉树中我们去找到这两个节点的公共父结点输出即可!

💥解题思路

思路一:

整体思路就是DFS求出p和q 的路径放到容器中,转换成路径相交。

我们用栈来充当这个容器,定义Ppath为当前节点左端的路径,qpath为右端的节点路径;

  • 图解:

  •  当我们成功的找到两端的路径之后,接下来就是判断步奏了:

 

 💥代码展示:

class Solution {
public:bool Getpath(TreeNode* root,TreeNode* x,  stack<TreeNode*>& path)
{if( root == nullptr )  return false;path.push(root);if(root == x)return true;if(Getpath(root->left,x,path))return true;if(Getpath(root->right,x,path))return true;path.pop();return false;
}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*>Ppath,qpath;Getpath(root,p,Ppath);Getpath(root,q,qpath);while(Ppath.size() != qpath.size()){if(Ppath.size() > qpath.size()){Ppath.pop();}elseqpath.pop();   }while(Ppath.top() != qpath.top()){Ppath.pop();qpath.pop();   }return Ppath.top();}
};
  • 最终结果:


思路二:

  1. 首先刚开始从根节点开始遍历,如果p和q中的任一个和root匹配,那么root就是最低公共祖先。
  2. 如果都不匹配,此时我们分别去递归左、右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树,则root就是我们要找的值,即最低公共祖先
  3. 如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树中。

 💥代码展示:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if( root == nullptr ){return nullptr;}//如果p和q中的任一个和root匹配,那么root就是最进公共祖先if( root == p || root == q ){return root;}//如果都不匹配,则分别递归左、右子树TreeNode* left = lowestCommonAncestor( root->left , p , q );TreeNode* right = lowestCommonAncestor( root->right , p , q );//如果有一个节点出现在左子树,并且另一个节点出现在右子树,则root就是最低公共祖先.if( left != nullptr && right != nullptr ){return root;} //如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树if( right == nullptr ){return left;} return right; }
};
  • 最终结果:


到此,便是本期题目的所有讲解内容了,希望对大家有所帮助!!!


http://www.ppmy.cn/news/47994.html

相关文章

scratch足球射门练习 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch足球射门练习 一、题目要求 1、准备工作 2、功能实现 二、案例分析

命令行语法格式

在学习一些Linux命令、执行脚本命令、安装执行程序的命令时&#xff0c;官方往往会提供一些命令行参数相关的说明。虽然不同系统会有一些差别&#xff0c;但这些说明通常是有约定俗成的写法的。 一般格式如下&#xff1a; 命令 <必选参数1|必选参数2> [-option {必选参…

node版本管理nvm的使用

在很多情况下对node版本需要安装多版本的控制&#xff0c;如何快速的切换node版本&#xff0c;请在配置完node的环境变量的基础上&#xff0c;阅读这篇文章。这里需要介绍nvm这个工具&#xff1a; 一、下载 官方下载地址&#xff1a;https://github.com/coreybutler/nvm-wind…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

煤矿电子封条视频监控系统 yolov7

煤矿电子封条视频监控系统基于yolov7python网络模型视频AI智能分析技术&#xff0c;煤矿电子封条视频监控算法模型对现场皮带撕裂、跑偏、皮带异物、堆煤等设备异常状态实时监控分析自动识别预警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队希望它能…

【网络小知识】TCP协议介绍/三次握手,四次挥手的作用

前端开发人员需要了解三次握手和四次挥手的原因是&#xff0c;这些概念是在客户端和服务器端之间进行网络通信时所涉及到的 TCP 协议的基本知识。而对于前端来讲&#xff0c;如果页面中请求服务端数据时出现连接失败、延迟等问题&#xff0c;就需要对TCP协议中三次握手、四次挥…

蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解

赛题介绍 挑战介绍 列置换加密是明文以每行固定字数&#xff08;key 的字母种类数&#xff0c;一般情况下 key 会选择字母不重复的单词&#xff09;一行一行写下&#xff0c;如果最后一行字数小于每行的固定字数&#xff0c;则使用特殊符号补充&#xff0c;这样就形成了一个矩…

分布式锁Redision

目录 1.ab工具(压测工具)的安装 2.前置 3.优化 3.1synchronized修饰代码方法/代码块 3.2分布式锁事务的解决方案 3.3Redis实现锁问题 3.3.1 set ex方式 3.3.2 set ex方式设置过期时间 3.3.3单redis结点的解决UUID和LUA脚本 3.3.4redission解决分布式锁 4.Redission解…

实验4 Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础&#xff1b; ②运用Matplotlib&#xff0c;实现数据集的可视化&#xff1b; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图&#xff0c;对数据进行可视化&#xff1b; ②下载波士顿数房价据集&#xff0c;并…

(一)Linux 环境下搭建 ElasticSearch (CentOS 7)

目录 1、搭建 Linux 相关环境 2、执行解压操作 3、创建新用户 4、修改配置文件 elasticsearch.yml 5、启动 ElasticSearch 6、修改虚拟机配置文件 7、重新启动 ElasticSearch 8、查看是否启动命令 9、访问 ElasticSearch 1、搭建 Linux 相关环境 没有服务器安装VM&a…

基于遗传算法的中药药对挖掘系统的设计与实现

用数据挖掘技术研究了中药方剂配伍的规律。主要工作&#xff1a;分析了关联规则存在的问题&#xff0c;引入双向关联规则的概念&#xff1b;介绍了遗传算法的基本原理&#xff0c;研究了遗传算法在数据挖掘中的应用&#xff1b;将方剂库转换为位图矩阵&#xff0c;大大提高搜索…

SpringBoot的Interceptor拦截器的简介和实际使用

拦截器&#xff08;Interceptor&#xff09; 概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 作用&#xff1a;拦截请求&#xff0c;在指定的方法调用前后&#xff0c;根据业务需要执行…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》&#xff0c;已经对证书这些概念有基本的了解&#xff…

Java中的数学相关类

文章目录 1.java.lang.Math2.java.math包2.1 BigInteger2.2 BigDecimal2.3 java.util.Random 1.java.lang.Math java.lang.Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数。类似这样的工具类&#xff0c;其所有方法均为静态方法&#…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;BGAPI SDK在图像回调中联合O…

4个实用JS库99%的人可能都不知道

前言 作为一名前端开发者&#xff0c;我通过这些JavaScript库大大提高了自己的效率&#xff0c;比如格式化日期、处理URL参数、调试手机网页等。因此&#xff0c;我想将这些好用的库分享给你们&#xff0c;也希望可以帮助到你们。 1.使用“Day.js”格式化日期和时间 地址&am…

【论文写作】如何写科技论文?万能模板!!!(以IEEE会议论文为例)

0. 写在前面 常言道&#xff0c;科技论文犹如“八股文”&#xff0c;有固定的写作模式。本篇博客主要是针对工程方面的论文的结构以及写作链条的一些整理&#xff0c;并不是为了提高或者润色一篇论文的表达。基本上所有的论文&#xff0c;都需要先构思好一些点子&#xff0c;有…

自定义泛型,自定义泛型接口,自定义泛型方法,JUnit,

class 类名<T,R....>{成员}//...表示可以有多个泛型因义的为静态是和类相关的&#xff0c;在类加载时&#xff0c;对象还没有创建&#xff0c; 泛型是对象创建的时候定 所以&#xff0c;如果静态方法和静态属性使用了泛型&#xff0c;JVM就无法完成初始化注意事项 packag…

paddlepaddle 的 CPU 和 GPU

想记录一下一个 bug 改了一上午改到最后发现并没有 bug 的 bug。 总结&#xff1a; 因为下午要跑很久&#xff0c;为了省 GPU 算力&#xff0c;我想上午先用 CPU 把数据处理部分跑出来&#xff08;感觉数据处理部分不像网络训练那样涉及太多计算&#xff0c;所以感觉用 CPU 就…

【定制功能】LVGL 邮件日志功能

更多源码分析请访问:LVGL 源码分析大全 目录 1、基本说明2、配置方法3、APIs3.1、xs_send_email_log1、基本说明 邮件日志功能是为了方便定位客户问题的方案。在使用此功能时,需要保证网络连接是正常的。 内存使用 日志功能使用的内存不超过 9K: 数据缓存(4096) + 消息缓存…