501. 二叉搜索树中的众数

devtools/2024/9/22 21:34:37/

501. 二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

img

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]
思路分析:

遇到二叉搜索树我们应该第一个想到的就是中序遍历

直白的解法:中序遍历二叉树 ,将遍历的数据收集到一个数组 ,然后我们遍历整个数组,找到所有众数。

也可以用*map<int,int>*进行保存 (first->元素的值 ,second->元素出现的频率)。

我这里介绍双指针的解法:

我们需要定义一些全局变量来辅助我们解题。

TreeNode *preTree = nullptr;   //记录当前遍历节点的前一个节点
vector<int>ret;
int maxCount = 0;   //二叉树中出现的最大频率,需要更新
int count = 0;      //记录每一个元素出现的频率

每遍历一个元素的时候 ,我们就对其出现的频率进行计算。

如果当前的元素 ,和他的前一个元素相等,那么对其频率 + 1 。

如果当前的元素 ,和他的前一个元素不相等,那么说明,又到了一个新的元素,将其频率置 1。

如果我们当前的数据的频率和我们最大的频率一样了 ,那么就将此元素收集起来。

对最大的频率进行更新 ,如果当前数据的频率大于我们的最大频率,将最大频率进行更新。并且说明之前我们收集的元素不是出现次数最多的 ,所有我们需要清空之前收集的元素 ,收集当前遍历到的元素。

具体代码实现:
class Solution {
public://中序遍历void find(TreeNode *root){if(!root)  return ;if(root->left)  find(root->left);if(!preTree){  //遍历到第一个节点count =1;}else if( preTree->val == root->val ){   //两个数相等的情况count++;}else { //不相等的情况count = 1;   //将出现的频率置一}preTree = root;   if(count == maxCount){   //如果当前数据出现的频率等于我们记录的最大的频率,则收集ret.push_back(root->val);}if(count > maxCount){    //说明遇到频率更大的数了maxCount = count;    //更新最大的频率ret.clear();         //将之前我们搜集的元素置空ret.push_back(root->val);     //加入当前频率最大的元素}if(root->right)  find(root->right);}vector<int> findMode(TreeNode* root) {if(!root) return  ret;find(root);return ret;}private:TreeNode *preTree = nullptr;   //记录当前遍历节点的前一个节点vector<int>ret;int maxCount = 0;   //二叉树中出现的最大频率,需要更新int count = 0;      //记录每一个元素出现的频率
};

http://www.ppmy.cn/devtools/35555.html

相关文章

Redis探索之旅(基础)

目录 今日良言&#xff1a;满怀憧憬&#xff0c;阔步向前 一、基础命令 1.1 通用命令 1.2 五大基本类型的命令 1.2.1 String 1.2.2 Hash 1.2.3 List 1.2.4 Set 1.2.5 Zset 二、过期策略以及单线程模型 2.1 过期策略 2.2 单线程模型 2.3 Redis 效率为什么这么高 三…

FastAdmin实现后台菜单自定义方法

FastAdmin实现后台菜单自定义显示&#xff0c;默认显示的是编辑和删除操作&#xff0c;我们有的时候是需要增加一些功能性的按钮&#xff0c;例如审核&#xff0c;或者说更多的关联性的信息。那么我们就可以按如下的操作去做 上面是默认展示的功能图片&#xff0c;下面我来简单…

第78天:WAF攻防-菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

目录 案例一&#xff1a; 菜刀-流量&绕过&特征&检测 菜刀的流量特征 案例二&#xff1a;冰蝎-流量&绕过&特征&检测 冰蝎使用教程 冰蝎的流量特征 案例三&#xff1a; 哥斯拉-流量&绕过&特征&检测 哥斯拉使用教程 哥斯拉的流量特征…

设计模式:工厂模式

工厂是每个开发人员都应该知道的关键创造模式之一。它们是许多高级模式的主要组成部分。很长一段时间&#xff0c;我在不同类型的工厂模式上遇到了麻烦。此外&#xff0c;在同一篇文章中很难找到有关这些类型的信息。本文介绍 4 种类型的工厂模式&#xff1a; 工厂方法模式&…

Discourse 清理存储空间的方法

Discourse 使用一段时间以后会发现硬盘空间占用非常多。 主要是因为 Docker Image 的问题&#xff0c;如果升级次数越多&#xff0c;空间占用越多。 运行下面的命令&#xff1a; ./launcher cleanup 能够帮助你清理 Discourse 占用的空间。 如下面代码所示&#xff1a; […

【随想录】Day37—第八章 贪心算法 part06

目录 题目1: 单调递增的数字1- 思路2- 题解⭐ 单调递增的数字——题解思路 题目2: 监控二叉树1- 思路2- 题解⭐ 监控二叉树——题解思路 题目1: 单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 1- 思路 1. 转 String&#xff1a;将 int 类型的数转为 String 类型&a…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

Flink面试整理-Flink是什么?

Flink是一个开源的流处理框架,用于处理大量数据流。它最初由柏林工业大学的几名博士生开发,并于2014年加入Apache软件基金会。Flink的主要特点和功能包括: 实时流处理:Flink专为连续的数据流设计,可以实时处理数据,支持高吞吐量和低延迟的数据处理。批处理能力:除了流处…