算法day17|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

本文主要是介绍算法day17|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法day17|算法day17|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

  • 530.二叉搜索树的最小绝对差
  • 501.二叉搜索树中的众数
  • 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差

中间的逻辑有一点小绕,我第一次也做了20分钟左右才发现问题。具体代码如下:

class Solution {
public:int Min=INT_MAX;TreeNode*pre=nullptr;int result=0;void traversal(TreeNode* root){if(root==nullptr)return;traversal(root->left);if(pre==nullptr)pre=root;else{result=abs(root->val-pre->val);if(result<Min){Min=result;}pre=root;}traversal(root->right);}int getMinimumDifference(TreeNode* root) {traversal(root);return Min;}
};

总体思路:利用BST的特性:中序序列单调递增。使用两个指针来得出两个结点之间的差值。

注意:

  1. 要用绝对值,abs()

				if(result<Min){Min=result;}pre=root;

注意,就算result>Min,pre也是照常不误地移动的,所以这里的pre要放在if外面

501.二叉搜索树中的众数

一开始我想用哈希表来接收的2,因为键值对也能显示这个数的个数。但是全部录入哈希表之后,我发现哈希表没办法去遍历…最后没能做出了来。看了卡哥的视频之后,感觉双指针法确实妙。具体代码如下:

class Solution {
public:TreeNode*pre=nullptr;int count=0;int Maxcount=0;vector<int> result;void traversal(TreeNode* root){if(root==nullptr)return;traversal(root->left);if(pre==nullptr)count=1;else if(pre->val==root->val)count++;else if(pre->val!=root->val)count=1;pre=root;if(count==Maxcount)result.push_back(root->val);if(count>Maxcount){Maxcount=count;result.clear();result.push_back(root->val);}traversal(root->right);return;}vector<int> findMode(TreeNode* root) {traversal(root);return result;}
};

要点:

  • 二叉搜索树一定要用中序遍历!

  • 双指针法的核心逻辑:

    • 当pre指针与root指针值相等时,count++;反之,则count=1。

    • 当count==Maxcount的时候,直接放入result数组;而当count>Maxcount的时候,直接清空result数组,重新放入元素。好处:这样就可以少遍历一次。

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

这道题的思路是比较新奇的,具体代码如下:

class Solution {
public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root==NULL)return NULL;if(root==p||root==q)return root;TreeNode*left=traversal(root->left,p,q);TreeNode*right=traversal(root->right,p,q);if(left!=NULL&&right==NULL)return left;else if(left==NULL&&right!=NULL)return right;else if(left!=NULL&&right!=NULL)return root;elsereturn NULL;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root,p,q);}
};

总体思路:

  • 返回值和参数都和主函数一样,这里返回值是结点类型(因为题目要求返回公共节点),在函数体内需要设置变量来接收。

  • 终止条件:

    • 当为null时返回null
    • 当这个结点就是p或者q的时候,我们要返回这个结点。这就是佯装成终止条件的终止行为,它对整个思路往往非常关键!
  • 单层递归逻辑:

    • 后序遍历:我们单层的思路是,利用该节点的孩子的信息,来做一些操作。所以我们肯定毫不犹豫的选择后序遍历。因为后序遍历就是在得知孩子的信息的基础上,对当前节点做一些操作。
    • 核心逻辑:回溯。即当该节点是p或q时,返回,然后作为上一层结点的左孩子结点信息。如果右孩子也不为null(传回了p或q),那么说明这个结点就是公共祖先,然后把自己往上传就行了。如果自己只有一个孩子不为null,说明自己不是祖先,这时就需要把这个孩子的信息上传,去寻找它的祖先。

这篇关于算法day17|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125505

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1