【二叉树算法题记录】501. 二叉搜索树中的众数

题目链接

题目描述

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

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

假定 BST 满足如下定义:

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

题目分析

首先我们遍历整个树,可以记录每个元素出现的次数(用map),然后对map进行排序,我们就能得到出现频率最高的元素。如下:

/*** 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:void traversal(TreeNode* cur, vector<int>& vec){if(cur==NULL) return;traversal(cur->left, vec);vec.push_back(cur->val);traversal(cur->right, vec);}bool static cmp_value(const pair<int, int>& left, const pair<int, int>& right){return left.second > right.second;}public:vector<int> findMode(TreeNode* root) {vector<int> result;vector<int> vec;// 遍历二叉树traversal(root, vec);// 利用map记录每个元素出现的次数unordered_map<int, int> map;    for(int i = 0; i < vec.size(); i++){map[vec[i]]++;  // 利用key记录出现的元素,value记录元素出现次数}// 根据value的大小对map进行排序vector<pair<int, int>> vec2(map.begin(), map.end());sort(vec2.begin(), vec2.end(), cmp_value);  // 这里定义了自己的比较方法cmp_value// 找map中value最大的元素result.push_back(vec2[0].first);// 因为众数可能不止一个,所以要看后面是否有key有一样的valuefor(int i = 1; i < vec2.size(); i++){if(vec2[i].second == vec2[0].second) result.push_back(vec2[i].first);else break;}return result;}
};

也可以在递归的同时就用map进行统计,修改后代码如下:

/*** 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:void traversal(TreeNode* cur, unordered_map<int, int>& map){if(cur==NULL) return;traversal(cur->left, map);map[cur->val]++;traversal(cur->right, map);}bool static cmp_value(const pair<int, int>& left, const pair<int, int>& right){return left.second > right.second;}public:vector<int> findMode(TreeNode* root) {vector<int> result;// 遍历二叉树unordered_map<int, int> map;traversal(root, map);// 根据value的大小对map进行排序vector<pair<int, int>> vec(map.begin(), map.end());sort(vec.begin(), vec.end(), cmp_value);  // 这里定义了自己的比较方法cmp_value// 找map中value最大的元素result.push_back(vec[0].first);// 因为众数可能不止一个,所以要看后面是否有key有一样的valuefor(int i = 1; i < vec.size(); i++){if(vec[i].second == vec[0].second) result.push_back(vec[i].first);else break;}return result;}
};

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

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

相关文章

Parasoft C++Test软件静态分析操作指南_编码规范/标准检查

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

python中的下划线用法总结

在 Python 中&#xff0c;下划线&#xff08;underscore&#xff09;有多种用法。它在不同的上下文中可以扮演不同的角色&#xff0c;下面是其常见用法的总结&#xff1a; 1. 单下划线"_" 1.1 作为临时变量或无用变量 在循环或解包操作中&#xff0c;表示一个临时…

微信小程序多端应用Donut Android生成签名

一、生成签名的作用 确保应用的完整性&#xff1a;签名可以确保应用在发布后没有被修改。如果应用被修改&#xff0c;签名就会改变&#xff0c;Android系统就会拒绝安装。确定应用的唯一身份&#xff1a;签名是应用的唯一标识&#xff0c;Android系统通过签名来区分不同的应用…

设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 迭代器模式&#xff08;Iterat…

基环树学习笔记

理论基础&#xff1a; 内向基环树就是每个联通块有且仅有一个环&#xff0c;并且出度为1的有向图&#xff0c;每一个内向基环树都是由联通环和指向联通环的树枝组成。而且基环可以只有两个节点构成。 Leetcode - 2127&#xff1a;参加会议的最多员工数 题目&#xff1a; 一个…

【WP|4】WordPress 简码(Shortcode)开发详解

简码&#xff08;Shortcode&#xff09;是 WordPress 提供的一项强大功能&#xff0c;允许开发者创建自定义的代码块&#xff0c;以便在文章、页面或小工具中轻松插入动态内容。本文将详细讲解简码的开发&#xff0c;从基础概念到高级用法&#xff0c;帮助你充分利用这一功能。…

fine-tune Microsoft/Phi-3-mini-128k-instruct

目录 logging超参数模型和Tokenizer加载数据处理数据集加载与处理训练保存微调模型参考使用transformers在聊天指令数据集上使用LoRA对Phi-3语言模型进行微调,以改进会话理解和响应生成。 logging 日志记录:设置日志记录以跟踪训练过程。 import sys import loggingimport …

【RabbitMQ】SpringAMQP--消息转换器

SpringAMQP–消息转换器 测试发送Object类型消息 1.声明队列 Configuration public class FanoutConfig {Beanpublic Queue objectQueue(){return new Queue("object.queue");} }运行消费者后&#xff1a; 2.发送消息 RunWith(SpringRunner.class) SpringBootTes…

【数据结构与算法】七大排序算法(上)

【数据结构与算法】七大排序算法(上) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 排序的概念及应用 1.1 排序的概念 1.2 排序的应用 1.3 常见排序算法 2. 常…

开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)

本文学习并分析App.Hosting项目中后台管理页面的标签管理页面、轮播图维护页面。 标签管理页面 标签管理页面用于显示、检索、新建、编辑、删除标签数据&#xff0c;以便在前台页面的首页及文章专栏等页面显示标签数据。标签管理页面附带一新建及编辑页面&#xff0c;以支撑新…

设计井字棋游戏(一)

创建游戏登录注册窗口 用户名admin 密码admin&#xff08;可自行改变&#xff09; 主页面 1. 导包 import pickle&#xff1a;导入 pickle 模块&#xff0c;这是一个 Python 的内置模块&#xff0c;用于将 Python 对象序列化和反序列化。序列化是指将对象转换为字节流&am…

如同“水生态”的存储引擎|OceanBase数据转储合并技术解读(一)

本系列文章主要围绕 OceanBase数据库存储引擎中的转储合并进行解读&#xff0c;涉及到数据存储、转储合并、数据校验等方面的内容&#xff0c;旨在让读者了解OceanBase数据库的存储引擎中与转储合并有关的各种概念&#xff0c;帮助读者更好地理解OceanBase数据库的存储技术原理…

基于STM32实现智能饮水机控制系统

目录 引言环境准备智能饮水机控制系统基础代码示例&#xff1a;实现智能饮水机控制系统 温度传感器数据读取水泵和加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;家庭和办公室的智能饮水管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在S…

关于pdfbox读取pdf

最近&#xff0c;想着将pdf的文件进行读取其内容&#xff0c;发现了一个比较好用的依赖pdfbox。目前使用这个依赖&#xff0c;进行实现一个简单实例&#xff0c;如果之后需要使用到更深的了解&#xff0c;会进行更新。这里提醒一下&#xff1a;jdk8尽量采用pdfbox3.x版本。 对…

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum&#xff0c;防止连接镜像失败 yum -y update#卸载系统之前的docker&#xff08;可选择&#xff0c;我这里直接注释了&#xff09; #yum remove docker docker…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

【驱动】串口硬件流控和RS485自动收发

1、流控(Flow Control) 串口通信中的流控(Flow Control)是一种用于管理数据传输速率,防止数据丢失的机制。 流控可以分为硬件流控(Hardware Flow Control)和软件流控(Software Flow Control),两者的目的都是确保发送方和接收方在数据传输过程中同步。 1.1 硬件流控…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心&#xff08;上篇&#xff09; 热身tops&#xff1a;选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式&#xff0c;开发模式他会跟你提示代码出现错误的地方以及出错原因&#xff0c;而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…

基于香橙派搭建家庭网盘

一、概述 家庭网盘是一种用于家庭用户的在线存储和文件共享服务。它允许家庭成员在云端存储、同步和分享照片、视频、文档等文件&#xff0c;方便快捷地访问和管理个人和家庭数据。家庭网盘通常提供安全可靠的数据存储和备份功能&#xff0c;保障用户数据的安全性。此外&#x…