代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

代码随想录Day21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

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

二叉搜索树的最小绝对差

文档讲解:代码随想录
视频讲解: 二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差
状态:

利用转换成数组的方式解决,学习一下利用双指针在中序遍历时求解,由于是二叉搜索树,所以最小绝对差一定是相邻的两数之间求得的。所以双指针就是要使用一个节点来记录当前节点的前一个节点,然后当递归,归到当前节点时(中节点操作),计算差值与此时的最小值比较。
首先需要定义一个全局变量,或者递归中传递一个引用,用来记录当前节点的前一个节点。然后一个全局变量或者引用参数用来记录当前最小值。
我们求取最小值的操作应当放在中节点,即当前节点位置进行,所以当我们的前一个节点不为空时,进行计算更新Minval。然后将当前节点变为前一个节点

class Solution {
private:TreeNode* pre;
public:void GetVector(TreeNode* root ,int& minval){if(root == nullptr) return;if(root->left) GetVector(root->left,minval);//中节点操作if(pre) minval = (root->val - pre->val) < minval ? (root->val - pre->val):minval;pre = root;//将当前节点赋值给前一个节点if(root->right) GetVector(root->right,minval);return ;}
public:int getMinimumDifference(TreeNode* root) {int minval = INT_MAX;GetVector(root,minval);return minval;}
};

二叉搜索树中的众数

文档讲解:代码随想录
视频讲解:

状态

定义变量记录当前相等的次数,如果相等就持续++,不等就重新置为1
处理最大值数组的元素
1. 当该元素出现的频率与当前最大值相等,那么直接压入
2. 当频率大于当前最大值,则重新赋值,并清空数组clear,然后压入

class Solution {
private: int maxcount = INT_MIN;int count = 0;TreeNode* pre = nullptr;
public:void GetVector(TreeNode* root, vector<int>& res){if(root == nullptr) return;//左节点GetVector(root->left,res);//中节点//先计算出现次数if(pre == nullptr){//说明是第一个节点count = 1;}else if(pre->val == root->val){count++;}else{//说明当前节点出现了1次count = 1;}pre = root;//处理最大频率压入数组if(count == maxcount){res.push_back(root->val);}//如果count>maxcount更新else if(count > maxcount){maxcount = count;res.clear();res.push_back(root->val);}//右节点GetVector(root->right,res);}
public:vector<int> findMode(TreeNode* root) {vector<int> res;GetVector(root ,res);return res;}
};

这是有序的情况即二叉搜索树,如果是普通二叉树,就需要先遍历获得每个元素以及该元素出现的频率可以使用map来存储,之后对map根据value排序,就需要将当前map转换为vector<pair<int,int>>然后定义一个排序函数,利用sort排序即可,或者可以参考求解前K个频率最大数的方法利用优先队列来求解。前k个高频

二叉树的最近公共祖先

文档讲解:代码随想录
视频讲解: 自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先
状态

最开始意味是一棵完全二叉树,那题目就变的简单了。对于任何一个节点其父节点的下标都是i/2。
可这道题只是一个普通二叉树,想到之前寻找路径,那么可以通过寻找从根节点到target两个节点的路径数组,然后定义两个指针,从两个数组出发,直到短的数组遍历完,如果有相同值就返回,没有就返回根节点.

class Solution {public: void findTarget(TreeNode* root, vector<TreeNode*>& path, const TreeNode* target,vector<TreeNode*>& res){if(root == nullptr) return ;path.push_back(root);if(root == target){   res = path;return ;} if(root->left){findTarget(root->left,path,target,res);path.pop_back();}if(root->right){findTarget(root->right,path,target,res);path.pop_back();}return ;}
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode*> ppath;vector<TreeNode*> qpath;vector<TreeNode*> pres;vector<TreeNode*> qres;findTarget(root,ppath,p,pres);findTarget(root,qpath,q,qres);int temps = pres.size() < qres.size() ? pres.size(): qres.size();for(int i = temps-1;i>=0;i--){if(pres[i] == qres[i]){return pres[i];break;}}return root;}
};

代码随想录里对递归函数是否有返回值做了说明

  1. 不需要返回值的情况–就是不用对返回值进行处理的情况,比如求得二叉树的所有路径构成的数组,或者是遍历二叉树到一个数组
  2. 需要返回值的情况
    • 遍历树的所有节点:这时候需要记录左节点和右节点递归的值,然后交给中节点进行处理,最后返回中节点。类似题目有求最大深度,或者求最小深度,求二叉树的最近公共祖先
    • 只需要遍历一条边,这种情况多发生在判断二叉树中是否有target如果有返回true,然后左子树和右子树根据归的结果返回true或者false
      在这里插入图片描述

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

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

相关文章

Nginx Ingress轻松上手 | Kubernetes服务管理指南

1. 揭秘Nginx Ingress的魔力 Nginx Ingress是你Kubernetes集群中的得力助手&#xff0c;无需额外安装&#xff0c;已内置于K8s。作为基于Nginx的扩展&#xff0c;它担任负载均衡器和入口控制器的重要角色。 2. 为何选择Nginx Ingress&#xff1f; 2.1 服务曝露的便利 通过简…

Kaggle之旅1

Kaggle之旅1 文章目录 Kaggle之旅1前言一、目标&#xff1f;二、课程1 pandas1. 学和练2. 一些关键摘要 总结 前言 Kaggle是一个以数据科学竞赛为主题的在线平台。它提供了一个数据科学社区&#xff0c;让数据科学家和机器学习专家可以在这里交流、学习和竞争。Kaggle上有大量…

深度掌握 Nginx Ingress:解锁高级功能,打造 Kubernetes 中的流量掌控艺术

前言 在 Kubernetes 的世界里&#xff0c;Nginx Ingress 不仅是流量的门卫&#xff0c;更是一把强大的调控利器。我们已经领略了其基础面貌&#xff0c;现在让我们踏上深度之旅&#xff0c;揭示 Nginx Ingress 的高级功能&#xff0c;助你在 Kubernetes 中创造流量掌控的艺术。…

2024秋招,深信服测试开发工程师一面

前言 回顾一下我秋招参加的第一次线下面试 这个面试体现出了我的很多弱点&#xff0c;也为我后面的改进起着很重要的作用 时间&#xff1a;40min 平台&#xff1a;线下面试 过程 1、个人介绍 2、项目经历 3、团队项目中负责的模块&#xff0c;队友都负责哪些工作&#x…

使用免费敏捷工具Leangoo领歌管理Sprint Backlog

什么是Sprint Backlog&#xff1f; Sprint Backlog是Scrum的主要工件之一。在Scrum中&#xff0c;团队按照迭代的方式工作&#xff0c;每个迭代称为一个Sprint。在Sprint开始之前&#xff0c;PO会准备好产品Backlog&#xff0c;准备好的产品Backlog应该是经过梳理、估算和优先…

C语言编译链接

1.翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执⾏环境&#xff0c;它⽤于实际执⾏代码。 2. 翻译环境 翻译环境是由编译和链接两个⼤的过程组成的&…

Spring环境搭配

概述 Spring 是一个开源框架&#xff0c;Spring 是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由 RodJohnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是 为了解决企业应用开发的复杂性而创建的。框架的主要优势…

mockjs使用1

mockjs使用 1、定义 Mock.js 是一款模拟数据生成器&#xff0c;旨在帮助前端攻城师独立于后端进行开发&#xff0c;帮助编写单元测试。提供了以下模拟功能&#xff1a; 根据数据模板生成模拟数据模拟 Ajax 请求&#xff0c;生成并返回模拟数据基于 HTML 模板生成模拟数据 2…

软件测试|SQLAlchemy query() 方法查询数据

简介 上一篇文章我们介绍了SQLAlchemy 的安装和基础使用&#xff0c;本文我们来详细介绍一下如何使用SQLAlchemy的query()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型&#xff0c;也可以复用上一篇文章中我们创建的模型&#xff0c;代码如…

Python字典,什么是字典、增删改查、属性操作和遍历

Python字典是一种无序的、可变的数据类型&#xff0c;它可以存储任意类型的数据&#xff0c;通过键值对的方式进行存储和访问。 字典的增&#xff1a; 使用键值对的方式&#xff0c;将数据添加到字典中。可以通过以下两种方式进行增加&#xff1a; 使用索引表达式&#xff08…

游戏开发,中小公司跳槽去大厂容易还是考研应届生校招容易?

游戏开发&#xff0c;中小公司跳槽去大厂容易还是考研应届生校招容易&#xff1f; 在之前的文章中&#xff0c;我们提到过&#xff0c;游戏开发行业首选直接进入游戏大厂。《开发者必读&#xff1a;如何选择适合的游戏开发公司&#xff1f;》因为大厂不仅能提供良好的职业发展…

接口防刷方案

1、前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 2、原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求&#xff0c;从Redis中统计用户访问接口次数从而达到接口防刷目的 如下图所示 3、案例工程 项目地址&#xff1a; htt…

localStorage、sessionStorage、vuex区别和使用感悟

一、介绍及区别 localStorage的生命周期是永久&#xff1b;不手动在浏览器提供的UI上清除localStorage信息&#xff0c;否则这些信息将永远存在。 sessionStorage的生命周期为当前窗口或标签页&#xff0c;一旦窗口或标签页被永久关闭&#xff0c;那么所有通过sessionStorage存…

AI红娘开启约会新时代;网易云音乐Agent实践探索;微软生成式AI课程要点笔记;ComfyUI新手教程;图解RAG进阶技术 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; Perplexity 官宣 7360 万美元B轮融资&#xff0c;打造世界上最快最准确的答案平台 https://blog.perplexity.ai/blog/perplexity-rais…

uniapp中uview组件库Toast 消息提示 的使用方法

目录 #基本使用 #配置toast主题 #toast结束跳转URL #API #Props #Params #Methods 此组件表现形式类似uni的uni.showToastAPI&#xff0c;但也有不同的地方&#xff0c;具体表现在&#xff1a; uView的toast有5种主题可选可以配置toast结束后&#xff0c;跳转相应URL目…

Linux系统——yum仓库及NFS共享

目录 一、yum仓库 1.yum简介 2.yum实现过程 3.如何实现安装服务 4.yum配置文件及命令 4.1yum配置文件 4.1.1主配置文件 4.1.2仓库设置文件 4.1.3日志文件 4.2yum命令详解 4.2.1查询 4.2.2yum安装升级 4.2.3软件卸载 4.2.4操作安装历史记录 5.搭建本地yum仓库 5…

【分布式技术】分布式存储ceph部署

目录 一、存储的介绍 单机存储设备 单机存储的问题 商业存储 分布式存储 二、分布式存储 什么是分布式存储 分布式存储的类型 三、ceph简介 四、ceph的优点 五、ceph的架构 六、ceph的核心组件 七、OSD存储后端 八、Ceph 数据的存储过程 九、Ceph 版本发行生命周…

NFS的共享与挂载

一、NFS网络文件服务 1.1简介 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议&#xff0c;最初由 Sun 公司开发。 通过使用 NFS 协议&#xff0c;客户机可以像访…

【数据库8.0备份还原】之Percona XtraBackup

目录 Percona XtraBackup备份数据库1、Percona XtraBackup的介绍2、Percona XtraBackup安装3、Percona XtraBackup8.0的使用1.全库备份和还原2.增量备份和还原3.差异备份和还原4.差异备份和增量备份的区别5.压缩备份和还原 Percona XtraBackup备份数据库 yum源安装&#xff1a…

Spring基础属性一览:注释、对象装配、作用域、生命周期

在Spring中想要更简单的存储和读取对象的核心是使用注解&#xff0c;也就是我们接下来要学的Spring中相关注解。 之前我们存储Bean时&#xff0c;需要在自己添加的配置文件中添加一行bean才行&#xff1a; 而现在我们只需要一个注解就可以替代之前要写的一行配置的繁琐了。 …