代码随想录算法训练营:19/60

非科班学习算法day19 | LeetCode530:二叉搜索树的最小绝对差 ,Leetcode501:二叉搜索树的众数 ,Leetcode236:二叉树的最近公共祖先 

目录

介绍

一、LeetCode题目

1.LeetCode530:二叉搜索树的最小绝对差 

题目解析

 2.Leetcode501: 二叉搜索树的众数 

题目解析

3.Leetcode236:二叉树的最近公共祖先

题目解析

 

总结


介绍

包含LC的两道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、LeetCode题目

1.LeetCode530:二叉搜索树的最小绝对差 

题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)

题目解析

       首先要知道,最小绝对差会出现在什么位置,因为限定了任意两个数的差值,但根据二叉搜索树的特点,如果用相隔远的两个数相减,差值一定大于相邻两数,所以问题退化到中序遍历相邻两数计算最小差值。

        可以采用设置临时指针pre来一遍遍历就完成。

        或者直观的方法,中序遍历记录元素信息,将得到的数组进行遍历。

 c++代码如下:

/*** 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:// 需要中序遍历,最小差出现在前后两个数中间,所以可以设置临时指针// 创建临时指针TreeNode* pre = nullptr;// 创建最大值int min_dif = INT_MAX;// 中序遍历函数void dis(TreeNode* root) {if (!root)return;// 左dis(root->left);// 处理if (pre) {int cur_dif = abs(pre->val - root->val);min_dif = min(min_dif, cur_dif);}pre = root;dis(root->right);return;}int getMinimumDifference(TreeNode* root) {dis(root);return min_dif;}
};

比较直观的c++代码如下:

/*** 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:void dis(TreeNode* root, vector<int>& vec) {if (!root)return;dis(root->left, vec);vec.push_back(root->val);dis(root->right, vec);return;}int getMinimumDifference(TreeNode* root) {vector<int> result;dis(root, result);int min_num = INT_MAX;for (int i = 0; i < result.size() - 1; ++i) {min_num = min(min_num, result[i + 1] - result[i]);}return min_num;}
};

 2.Leetcode501: 二叉搜索树的众数 

题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)

题目解析

       个人认为很喜欢的一道题目,我遵循的也是双指针思想:中序遍历,实时更新最大长度,然后将最大长度对应的结果放到返回数组中,但是遇到了问题:

        1.最大初始长度设置为0,这样一开始的根节点怎么处理,因为实际上最小的长度应该是1

        2.在一次遍历的过程中,如果发现最大值就记录,其实不能保证这是全过程的最大长度(后面的可能会有更长的),那么弹出的条件怎么设置。
       

 C++代码如下: 

/*** 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:// 设置前一指针TreeNode* pre = nullptr;// 设置最大长度int max_len = 0;// 设置当前长度int len = 0;vector<int> res;void dis(TreeNode* root) {if (!root)return;dis(root->left);if (!pre)len = 1;else if (pre->val == root->val) {len++;} elselen = 1;if (len == max_len) {res.push_back(root->val);}if (len > max_len) {max_len = len;res.clear();res.push_back(root->val);}pre = root;dis(root->right);return;}vector<int> findMode(TreeNode* root) {max_len = 0;len = 0;res.clear();pre = nullptr;dis(root);return res;}
};

关于这两个问题:1.pre指针还指向空的时候就把指针设置为1,注意在长度没有增加时候else情况,要把长度重置为1,这点很重要。其实我认为也可以直接初始化就设置为1;

2.没有必要弹出,因为如果后面搜索到更长的长度,我们只需要清空当前结果就可以了,前面的结果都不是想要的。

  

3.Leetcode236:二叉树的最近公共祖先

题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)

题目解析

       一开始理解的很艰难,因为涉及到类似于从底部向上检索的过程,这里面是一定有回溯。首先纠正一个问题,就是我在尝试用bool的返回类型辅助函数,但是我写的过程中发现我无法用这个函数来记录或者说返回节点信息,除非是用pair来记录存在信息和节点信息,那样理解是相对好了,但是写法上复杂度大大增加。

        现在的写法的关键就是,还是后序遍历的模板,但是在回溯过程中(就是return!)当不存在我们需要检索的值时候,返回空指针,这样也可以帮助我们bool判断!

        标记一下,相关的有需要下向上搜索的题目,后期再比对总结:树的最大深度/最小深度,树的直径,路径总和问题

C++代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root)return NULL;if (root->val == p->val || root->val == q->val)return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left && right)return root;if (!left && right)return right;if (left && !right)return left;elsereturn NULL;}
};

注意点1:代码虽然看起来简单,但是这个中止条件之所以没有放在后面是因为,遵循的逻辑是先向下搜索,搜索到需要值,返回这个节点信息到上一层,这样就记录了节点信息。

而后面的处理是针对于一层递归左右结束之后中节点的处理逻辑,两者是不一样的,不要混淆。

 

总结


补打卡第19天,坚持!!!

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

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

相关文章

软设之加工逻辑之结构化语言

结构化语言是一种介于自然语言和形式化语言之间的半形式语言&#xff0c;是自然语言的一个受限子集 外层&#xff1a;用来描述控制结构&#xff0c;采用顺序&#xff0c;选择和重复3种基本结构 1.顺序结构&#xff1a;一组祈使语句&#xff0c;选择语句&#xff0c;重复语句的…

个人对JVM的一点理解

JVM&#xff08;Java 虚拟机&#xff09;是 Java 程序能够跨平台运行的关键。它负责将 Java 字节码转换为机器码并执行。 JVM 主要由类加载器、运行时数据区、执行引擎和本地方法接口等部分组成。运行时数据区包括方法区、堆、虚拟机栈、本地方法栈和程序计数器等。 GC&#xf…

远期利率(Forward Rate)是什么?以及远期利率在期货合约中的应用

远期利率是什么&#xff1f; 中文版 远期利率&#xff08;Forward Rate&#xff09;是指从未来某一时间段开始适用的利率。它是金融市场上的一种合约利率&#xff0c;表示在某个特定日期开始的一段时间内的预期利率。这种利率可以通过现有的即期利率&#xff08;Spot Rate&am…

6.26考试前总结

一、选择 1、运算符重载&#xff1a;&#xff08;1&#xff09;不可重载&#xff1a;. .* :: ?: sizeof &#xff08;2&#xff09;只成员函数&#xff1a;、[]、&#xff08;&#xff09;、-> ps:和[]需要加&&#xff0c;返回类&#xff0c;[]返回中括号内…

SpringBoot根据不同IP限制接口的QPS

根据对方IP地址来限制接口的QPS&#xff08;每秒查询率&#xff09;&#xff0c;你可以结合Spring Boot应用、Guava的RateLimiter或者自定义的并发控制逻辑来实现。以下是一个基于Guava RateLimiter和Spring Boot的示例&#xff0c;展示如何根据IP地址来限制接口的QPS&#xff…

镜头下的光学

说实话&#xff0c;当我看到几何光学的内容全是初中的解析几何的时候&#xff0c;我就觉得讲的方式太原始了&#xff0c;而且太过复杂也看不懂。所以我尝试做了数学建模&#xff0c;发现建模之后模型可以解释一些物理现象&#xff0c;也不会有矛盾的地方&#xff0c;那就算过得…

【Python系列】探索 Python 环境管理工具:conda 与 pip 的比较

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

简过网:专科生可以考的编制岗位有哪些?这5个铁饭碗要抓住了!

专科生可以考的编制岗位有哪些&#xff1f;以下这几种可以考的&#xff0c;尤其是应届毕业生&#xff0c;一定要抓住机会哦&#xff01; ​ 一、三支一扶&#xff1a;专科生可报考&#xff0c;期满可转编。 三支一扶&#xff1a;支农、支医生、支教、扶贫 工作时间一般为2年&…

深入探索Postman:前置与后置脚本的编写与应用

Postman是一款广受欢迎的API开发和测试工具&#xff0c;它提供了丰富的功能来简化接口测试过程。在Postman中&#xff0c;前置脚本&#xff08;Pre-request Script&#xff09;和后置脚本&#xff08;Tests Script&#xff09;是两个强大的功能&#xff0c;允许用户在发送请求之…

秋招Java后端开发冲刺——非关系型数据库篇(Redis)

一、非关系型数据库 1. 主要针对的是键值、文档以及图形类型数据存储。 2. 特点&#xff1a; 特点说明灵活的数据模型支持多种数据模型&#xff08;文档、键值、列族、图&#xff09;&#xff0c;无需预定义固定的表结构&#xff0c;能够处理各种类型的数据。高扩展性设计为水…

安全技术和防火墙(一)

安全技术和防火墙 安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要提供报警和事后监督 不主动介入 (监控) 入侵防御系统&#xff1a;透明模式工作 &#xff0c;数据包,网络监控,服务攻击,木马,蠕虫,系统漏洞 等 进行准确的分析判断 判断为攻击行为后会…

高校心理咨询管理系统

摘 要 随着高校学生心理问题的增多&#xff0c;心理咨询服务在高校中的重要性日益凸显。然而&#xff0c;传统的心理咨询管理方式存在着诸多问题&#xff0c;如信息不透明、咨询师资源不足等。为了解决这些问题&#xff0c;本文设计并实现了一种基于Java Web的高校心理咨询管理…

model_json_schema

model_json_schema示列 from pydantic import BaseModel, Field, ValidationError, field_validatorclass User(BaseModel):id: int Field(default0, lt100, gt0)username: stremail: strfield_validator(username)def name_must_alpha(cls, v):assert v.isalpha(), name mus…

浸式冷却设计参数

每天一篇行业发展资讯&#xff0c;让大家更及时了解外面的世界。 更多资讯&#xff0c;请关注B站/公众号【莱歌数字】&#xff0c;有视频教程~~ 两相被动浸入冷却是指使用改变相的沸腾液体来去除一个或多个表面的热量的冷却系统。 然后蒸汽被移动到冷凝器&#xff0c;然后被…

LaTeX中添加矩阵分块虚线并设置虚线疏密

对于大型矩阵&#xff0c;有时需要添加分块虚线。 方法为使用arydshln宏包&#xff0c;然后在array环境中设置虚线。需要注意的是&#xff0c;使用矩阵环境需要搭配amsmath宏包使用&#xff0c;且需放在amsmath宏包之后。即导言区设置为 \usepackage{amsmath} \usepackage{ary…

日语培训日语等级考试柯桥小语种学习语言学校

什么是外来语 外来语是指在日本的国语中使用的来源于外国语言的词汇。但狭义上的外来语则是指来源于欧美国家语言的词汇&#xff0c;其中大部分是来源于英美语系的词汇。日语中的汉语词汇很多&#xff0c;大多是自古以来从中国引进的&#xff0c;从外来语的定义看&#xff0c;汉…

NLP逻辑层次模型|跳出局限,站在更高维度认识自己

什么是NLP逻辑层次模型 N-Neuro&#xff1a;指神经系统&#xff0c;包括生理基础&#xff08;大脑&#xff09;和思维运作过程 L-Linguistic&#xff1a;指语言&#xff0c;感觉信号输出——构成意思的过程 P-Programming&#xff1a;指程序&#xff0c;大脑产生某结论后要具体…

【干货】Vue3 组件通信方式详解

前言 毫无疑问&#xff0c;组件通信是Vue中非常重要的技术之一&#xff0c;它的出现能够使我们非常方便的在不同组件之间进行数据的传递&#xff0c;以达到数据交互的效果。所以&#xff0c;学习组件通信技术是非常有必要的&#xff0c;本文将总结Vue中关于组件通信的八种方式…

代码随想录算法训练营DAY49|300.最长递增子序列、 674. 最长连续递增序列、718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;300.最长递增子序列dp初始化为1&#xff08;最小子序列长度为1&#xff09; class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp [1]*len(nums)result …

leetcode-18- [669]修剪二叉搜索树[108]将有序数组转换为二叉搜索树[538]把二叉搜索树转换为累加树

重点&#xff1a;一般二叉树多考虑遍历顺序&#xff0c; 二叉搜索树多考虑特性&#xff0c;不用考虑遍历顺序。 一、[108]将有序数组转换为二叉搜索树 左闭右开 偶数取左边 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0, nums…