代码随想录算法训练营29期Day18|LeetCode 513,112,113,106,105

  文档讲解:找树左下角的值  路径总和  从中序与后序遍历序列构造二叉树

513.找树左下角的值

题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/

思路:

        本题要求我们找到树最深一层的最左节点的值。搜索的话复杂度应该会高,判断条件也不好写。所以这题很明显使用迭代法进行层序遍历,每层记录最左节点(即第一个节点)的值即可。迭代完成后自然记录的是最深一层的最左节点值。

核心代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> q;int ans;if(root) q.push(root);while(!q.empty()){TreeNode* cur;int n=q.size();cur=q.front();ans=cur->val;while(n--){cur=q.front();q.pop();if(cur->left) q.push(cur->left);if(cur->right) q.push(cur->right);}}return ans;}
};

112.路径总和

题目链接:https://leetcode.cn/problems/path-sum/description/

思路:

        本题要求我们判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum

        那我们从根节点向下搜索即可,记录到当前节点的总和值,处理到叶子节点时,判断这个值是否等于targetSum即可,或者初始值设为-targetSum,每搜索到一个节点就把值加进去,到达叶子节点时判断总和是否为0即可。最后不要忘记回溯。

核心代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:bool dfs(TreeNode* cur,int sum){if(!cur->left&&!cur->right){if(sum==0) return true;else return false;}if(cur->left&&dfs(cur->left,sum+cur->left->val)) return true;if(cur->right&&dfs(cur->right,sum+cur->right->val)) return true;return false;}
public:bool hasPathSum(TreeNode* root, int targetSum) {if(!root) return false;return dfs(root,-1*targetSum+root->val);}
};

113.路径总和II

题目链接:https://leetcode.cn/problems/path-sum-ii/

思路:

       本题与上题进行深搜的方式和逻辑一模一样,唯一需要注意的地方是本题需要记录路径,开一个path记录即可,path可以是全局变量,也可以传参,最后判断路径的sum等于targetSum时把记录的路径加到答案数组就可以了。

核心代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:vector<vector<int>> ans;void dfs(TreeNode* cur,int sum,vector<int>& path){if(!cur->left&&!cur->right){if(!sum) ans.push_back(path);return;}if(cur->left){path.push_back(cur->left->val);dfs(cur->left,sum+cur->left->val,path);path.pop_back();}if(cur->right){path.push_back(cur->right->val);dfs(cur->right,sum+cur->right->val,path);path.pop_back();}return ;}
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<int> path;if(root) path.push_back(root->val);if(root) dfs(root,root->val-targetSum,path);return ans;}
};

106.从中序与后序遍历序列构造二叉树

题目链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/

思路:

       首先我们要意识到一件事,中序为左中右,后序为左右中。下面我们分三步走:

       1.因此我们可以知道,后序遍历序列的最后一个点,就是根节点。

       2.查找根节点这个值在中序序列的位置,我们可以以此为分割得到左右两个序列。左边对应的是根节点左边子树的中序遍历序列,右边对应的是根节点右边子树的中序序列。知道左右子树的中序序列,我们也就知道了他们的大小。

       3.由左右子树的大小,我们再来分割后序序列,后序序列的前一部分和左子树序列长度相同的序列,就是左子树的后序遍历序列。后面一部分去掉最后一个点则是右子树的后序序列。

       到上面一步我们发现一件事情,我们得到了根节点,和左右子树分别的中序和后序序列。我们发现第一步就是根据中序后序来构造。因此我们对左右子树重复这三步即可。不断的迭代重复,直到子树剩下一个点,那就是叶子节点了,我们开始一步步回溯,把每个子树的根节点回溯到上一层,那就是上一层的左右子节点。

       回溯到最后,我们得到的就是根节点,并且树也建好了。

核心代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:TreeNode* travelsal(vector<int>& inorder,vector<int>& postorder){if(!postorder.size()) return NULL;int midval=postorder[postorder.size()-1];TreeNode* cur=new TreeNode(midval);if(postorder.size()==1) return cur;int mid;for(mid=0;mid<inorder.size();mid++)if(inorder[mid]==midval) break;vector<int> leftinorder(inorder.begin(),inorder.begin()+mid);vector<int> rightinorder(inorder.begin()+mid+1,inorder.end());postorder.pop_back();vector<int> leftpost(postorder.begin(),postorder.begin()+leftinorder.size());vector<int> rightpost(postorder.begin()+leftinorder.size(),postorder.end());cur->left=travelsal(leftinorder,leftpost);cur->right=travelsal(rightinorder,rightpost);return cur;}
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {return travelsal(inorder,postorder);}
};

105.从前序与中序遍历序列构造二叉树

题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

思路:

       会了上一道题就会这一道,本题与上题的处理方式和逻辑基本一致。唯一的区别是后序换成了前序,前序为中左右,因此我们的前序序列的第一个点为树的根节点,切割序列时注意这一点即可。

核心代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:TreeNode* travelsal(vector<int>& preorder,vector<int>& inorder){if(!preorder.size()) return NULL;int curval=preorder[0];TreeNode* cur=new TreeNode(curval);int curplace;for(curplace=0;curplace<inorder.size();curplace++)if(inorder[curplace]==curval) break;vector<int> leftin(inorder.begin(),inorder.begin()+curplace);vector<int> rightin(inorder.begin()+curplace+1,inorder.end());preorder.erase(preorder.begin());vector<int> leftpre(preorder.begin(),preorder.begin()+leftin.size());vector<int> rightpre(preorder.begin()+leftin.size(),preorder.end());cur->left=travelsal(leftpre,leftin);cur->right=travelsal(rightpre,rightin);return cur;}
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return travelsal(preorder,inorder);}
};

今日总结

        今日学习时长4h,题目不算难。

        剩下时间查论文看论文准备开题。

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

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

相关文章

xtu oj 1183 sum times

题目描述 整数a,b,其中ab c,a*b d,已知c和d&#xff0c;问是否存在a和b&#xff1f; 输入 第一行是一个整数K&#xff0c;表示样例个数。 每个样例占1行&#xff0c;两个整数c和d&#xff0c;0≤c,d≤109。 输出 每行输出一个样例的结果&#xff0c;a和b(a≤b)&#xff…

vite 创建 react 项目

npm create vitelatest 选择 react 和 ts 安装 react-redux 、react-router-dom 、redux 安装 reset-css 样式初始化 npm i --save-dev sass // 禁用文字选中 user-select: none; img{ // 禁止图片拖动 -webkit-user-drag: none; } 正确的样式引入顺序 样式初始化即 re…

51-11 多模态论文串讲—VLMo 论文精读

VLMo: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts (NeurIPS 2022) VLMo 是一种多模态 Transformer 模型&#xff0c;从名字可以看得出来它是一种 Mixture-of-Modality-Experts (MoME)&#xff0c;即混合多模态专家。怎么理解呢&#xff1f;主流 …

yolov5无人机视频检测与计数系统(创新点和代码)

标题&#xff1a;基于YOLOv5的无人机视频检测与计数系统 摘要&#xff1a; 无人机技术的快速发展和广泛应用给社会带来了巨大的便利&#xff0c;但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控&#xff0c;本文提出了一种基于YOLOv5的无人机视频检测与计数系…

[软件工具]通用OCR识别文字识别中文识别服务程序可局域网访问

【软件界面】 【算法介绍】 采用业界最先进算法之一paddlocr&#xff0c;PaddleOCR&#xff0c;全称PaddlePaddle OCR&#xff0c;是一种基于深度学习的光学字符识别&#xff08;OCR&#xff09;技术。相较于传统的OCR技术&#xff0c;PaddleOCR具有许多优点。 首先&#xff0…

Activity 启动流程log分析

为了方便跟踪启动过程相关流程&#xff0c;打开debug开关&#xff0c;并添加Log打印 1.Log打点 1&#xff09;打开debug开关 打开 WindowManagerDebugConfig开关&#xff0c;会打开InputMonitor InputManagerCallback PhoneWindowManager中的input向相关日志打印 public st…

南京观海微电子----时序分析基本概念(一)——建立时间

1. 概念的理解 以上升沿锁存为例&#xff0c;建立时间&#xff08;Tsu&#xff09;是指在时钟翻转之前输入的数据D必须保持稳定的时间。如下图所示&#xff0c;一个数据要在上升沿被锁存&#xff0c;那么这个数据就要在时钟上升沿的建立时间内保持稳定。 建立时间是对触发器而…

RibbonGroup 添加QLineEdit

RibbonGroup添加QLineEdit&#xff1a; QLineEdit* controlEdit new QLineEdit(); controlEdit->setToolTip(tr("Edit")); controlEdit->setText(tr("Edit")); controlEdit->setMinimumWidth(150); …

C //练习 5-20 扩展dcl程序的功能,使它能够处理包含其他成分的声明,例如带有函数参数类型的声明、带有类似于const限定符的声明等。

C程序设计语言 &#xff08;第二版&#xff09; 练习 5-20 练习 5-20 扩展dcl程序的功能&#xff0c;使它能够处理包含其他成分的声明&#xff0c;例如带有函数参数类型的声明、带有类似于const限定符的声明等。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的I…

Codeforces Round 919 (Div. 2)补题

Satisfying Constraints&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;有三种限定方式&#xff1a; 1.k>x; 2.k<x; 3.k!x; 根据若干限定&#xff0c;找出合法的k的个数。 思路&#xff1a;通过1&#xff0c;2定出区间&#xff0c;同时记录…

基于FFmpeg的简单Android视频播放器

1. 模块分割 首先对这个视频播放器所采用的一些部件要清楚。这个播放器主要可以拆分为4个部分&#xff1a; 1.解码&#xff1a;FFmpeg 2.音频输出&#xff1a;OpenSLES 3.视频渲染&#xff1a;OpenGLES 这些框架都是基于C的api&#xff0c;因此这次我们的主要工作将会集中…

ubuntu20.04安装cuda11.4以及cudnn

系统&#xff1a;ubuntu20.04硬件配置&#xff1a;GPU3080、CPU未知通过《软件和更新》在附加驱动选项中添加了驱动&#xff1a; 1.检查自己电脑支持的cuda nvidia-smi4. 下载cuda11.4.2 wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/c…

TypeScript 从入门到进阶之基础篇(十) 抽象类篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

AI-图片转换绚丽动漫人物-UGATIT

​​​​​​ &#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​​​​…

P1125 [NOIP2008 提高组] 笨小猴——C++

[NOIP2008 提高组] 笨小猴 题目描述 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选对的几率非常大&#xff01; 这种方法的具体描述如下&#xff1a;假设 maxn…

【Databend】多表联结,你不会还没有掌握吧!

文章目录 概述和数据准备内连接交叉连接左连接右连接左反和右反连接全连接总结 概述和数据准备 多表联结是两个或多个表的列合并到一个结果集中。Databend 中支持的连接类型有 inner join 、cross join 、natural join 、left join 、right join 、left anti join 、right ant…

SqlAlchemy使用教程(二) 入门示例及通过CoreAPI访问与操作数据库

二、入门示例与基本编程步骤 在第一章中提到&#xff0c;Sqlalchemy提供了两套方法来访问数据库&#xff0c;由于Sqlalchemy 文档杂乱&#xff0c;对于ORM的使用步骤讲解杂乱&#xff0c;SqlAlchemy2.x 与j1.x版本差异也较大&#xff0c;很多介绍SqlAlchemy的文章上来就讲ORM&…

Apache Camel Jbang的dep和classpath 及-O 简单记录

在Apache Camel Jbang 官网主要提到的deps的用法&#xff0c;classpath的较少。 deps 适用于环境上有maven repository或者git 的场景&#xff0c;对于传统发布jar/war的模式下&#xff0c;classpath更适用。 DEPS和CP都支持文件内或者命令行指定&#xff0c;文件内写法为 /…

TS2307: Cannot find module ‘./App.vue‘ or its corresponding type declarations.

目录 1. 问题描述2. 解决方案一&#xff1a;VSCode Volar&#xff08;官方推荐&#xff09;3. 解决方案二&#xff1a;WebStorm 2023.2 &#xff08;官方推荐&#xff09;4. 解决方案三&#xff1a;禁用严格类型检查选项&#xff08;不推荐&#xff09;5. 解决方案四&#xff…

大模型实战营Day5 LMDeploy大模型量化部署实践

模型部署 定义 产品形态 计算设备 大模型特点 内存开销大 动态shape 结构简单 部署挑战 设备存储 推理速度 服务质量 部署方案&#xff1a;技术点 &#xff08;模型并行 transformer计算和访存优化 低比特量化 Continuous Batch Page Attention&#xff09;方案&#xff08;…