代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

文章目录

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


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

在这里插入图片描述
在这里插入图片描述

因为二叉搜索树的中序遍历是有序的,所以在中序递归遍历的基础上,记录前一个节点的指针,递归的过程中用后一个节点减去前一个,就可以得到差值,保存最小差值并返回。
代码如下:

/*** 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<int> vec;int result = INT_MAX;TreeNode* pre = nullptr;void traversal(TreeNode* node) {if(node == nullptr) return;traversal(node->left);if(pre != nullptr) {result = min(result, node->val - pre->val);}pre = node;traversal(node->right);}
public:int getMinimumDifference(TreeNode* root) {traversal(root);return result;}
};

2.二叉搜索树中的众数

在这里插入图片描述

还是根据二叉搜索树的中序遍历是有序的,所以在递归中序遍历中记录重复出现次数,下面我们主要探究如何记录。
先定义一个前指针,判断前指针和当前指针相同则count++
这时有一个问题,众数不止一个,所以我们还需要记录 当前众数的最大次数maxCount,当出现第二个元素等于maxCount,将此元素也放入众数集合,如果出现一个元素大于当前maxCount,还需要清空众数集合,并且更新最大次数。
代码如下:

class Solution {
private:int maxCount = 0; // 最大频率int count = 0; // 统计频率TreeNode* pre = NULL;vector<int> result;void searchBST(TreeNode* cur) {if (cur == NULL) return ;searchBST(cur->left);       // 左// 中if (pre == NULL) { // 第一个节点count = 1;} else if (pre->val == cur->val) { // 与前一个节点数值相同count++;} else { // 与前一个节点数值不同count = 1;}pre = cur; // 更新上一个节点if (count == maxCount) { // 如果和最大值相同,放进result中result.push_back(cur->val);}if (count > maxCount) { // 如果计数大于最大值频率maxCount = count;   // 更新最大频率result.clear();     // 很关键的一步,不要忘记清空result,之前result里的元素都失效了result.push_back(cur->val);}searchBST(cur->right);      // 右return ;}public:vector<int> findMode(TreeNode* root) {count = 0;maxCount = 0;pre = NULL; // 记录前一个节点result.clear();searchBST(root);return result;}
};

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

在这里插入图片描述
在这里插入图片描述

二叉树回溯的过程就是从低到上(后序遍历),刚好契合本题从下往上找最近公共祖先节点。
1.参数和返回值:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
2.终止条件:找到q或者p或者遇到空节点返回。
3.单层递归逻辑:我们要遍历整个树,所以不能立刻返回。
在这里插入图片描述

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == q || root == p || root == NULL) return root;//终止条件TreeNode* left = lowestCommonAncestor(root->left, p, q);//单层递归逻辑TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left != NULL && right != NULL) return root;if (left == NULL && right != NULL) return right;else if (left != NULL && right == NULL) return left;else  { //  (left == NULL && right == NULL)return NULL;}}
};

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

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

相关文章

企业数字化转型,如何选择适合的邮件系统?

随着数字经济的发展&#xff0c;数字办公已经成为企业未来发展的必经之路。而邮件系统作为企业内外沟通的重要办公工具&#xff0c;在企业数字化转型中发挥着重要作用。它能够帮助企业更便捷地跟踪管理业务&#xff0c;优化流程、提升工作效率和协同能力。但是&#xff0c;企业…

给自己留个备忘,blender是右手坐标系

所谓右手坐标系&#xff0c;就是三个轴的方向和右手三根手指的方向一致&#xff08;当然&#xff0c;有要求的&#xff0c;这个要求是大拇指指向x轴方向&#xff0c;食指指向y轴方向,中指指向z轴方向&#xff09;。 不过blender默认是z轴朝上的&#xff0c;如下图。 右手坐标系…

记阿里云mysql丢表丢数据的实践记录

第一时间挂工单&#xff0c;联系工程师指引&#xff0c;现在回过来想&#xff0c;第一时间要确认发生时间。 1.通过性能视图&#xff08;马后炮的总结&#xff0c;实际凭记忆恢复了三四次才找到数据&#xff09; 2.先恢复数据 通过Navicat工具&#xff0c;结构同步&#xff0…

linux操作系统期末练习题

背景&#xff1a; 一、远程登录 1&#xff0e;利用远程登录软件&#xff0c;以用户userManager(密码123456)&#xff0c;远程登录教师计算机&#xff08;考试现场给出IP地址&#xff09;&#xff0c;只有操作&#xff0c;没有命令。 2&#xff0e;以stu班级学生个人学号后3位…

[LWC] Components Communication

目录 Overview ​Summary Sample Code 1. Parent -> Child - Public Setter / Property / Function a. Public Property b. Public getters and setters c. Public Methods 2. Child -> Parent - Custom Event 3. Unrelated Components - LMS (Lightning Message…

Odoo系统安装部署并结合内网穿透实现固定域名访问本地ERP系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

预测性维修系统的功能分析和建设建议

随着工业领域的不断发展&#xff0c;设备状态监测、健康管理和智能诊断变得愈发重要。预测性维修系统通过先进的技术和可靠性评估&#xff0c;帮助企业判断设备状态&#xff0c;识别故障早期征兆&#xff0c;并生成故障预判&#xff0c;从而提出检维修建议。在这一背景下&#…

c++数据结构算法复习基础--1

一、大体复习内容 复习思路&#xff1b; 二、数据结构算法-常见复杂度汇总介绍-性能对比-图表展示 数据结构: 相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构&#xff0c;散列结构、树形结构&#xff0c;图形结构等等。 数据结构说的是组织…

Linux编程 1.3 系统文件IO- 内核表示

文件IO内核表示 1、内核中的三种数据结构 1.1文件描述符表 文件描述符标志 文件表项指针1.2 文件表项 文件状态标志 读、写、追加、同步和非阻塞等状态标志 当前文件偏移量 i节点表项指针 引用计数器1.3 节点 文件类型和对该文件的操作函数指针 当前文件长度 文件所有者 文…

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

猫头虎分享已解决Bug || 未找到资源:NotFoundError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …