力扣日记12.23-【二叉树篇】501. 二叉搜索树中的众数

力扣日记:【二叉树篇】501. 二叉搜索树中的众数

日期:2023.12.23
参考:代码随想录、力扣

501. 二叉搜索树中的众数

题目描述

难度:简单

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

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

假定 BST 满足如下定义:

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

示例 1:
在这里插入图片描述

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

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 10^4] 内
  • -10^5 <= Node.val <= 10^5

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

题解

/*** 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:TreeNode* pre = nullptr;vector<int> result;int maxCount = 1;int count = 1;
public:vector<int> findMode(TreeNode* root) {traversal(root);return result;}void traversal(TreeNode* root) {// 左中右if (root == nullptr)    return;// 左traversal(root->left);// 中if (pre != nullptr) {if (root->val == pre->val) {// 相等, count++count++;} else {count = 1;  // 重新置为1}}pre = root;if (count == maxCount) {    // 如果当前计数与maxCount一致,说明可能是众数,放入数组中result.push_back(root->val);} else if (count > maxCount) {  // 如果比maxCount大了,说明当前数才是新的众数,清空原来数组,加入当前数maxCount = count;result.clear();result.push_back(root->val);}// 右traversal(root->right);}
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 这次没看代码随想录就能跟其思路基本一致,有点小开心2333(ww对我来说太难得了)
  • 对于二叉搜索数,中序遍历的时候是有序的,相当于处理有序数组一样,如何在一次遍历的时候就能找到所有众数呢?关键的有两点:
    • 1.如果遍历到当前值,count==maxCount了,就将其当作可能的众数,加入结果集中
    • 2.但是一旦发现当前值的count>maxCount,说明当前值才是新的唯一的众数,要清空原先的结果集,再把当前值加入
  • 本题同样注意要用 pre 来记录上一个节点,且这里为了方便,将count、maxCount、pre和result都作为全局变量了
  • 另外的解法:
    • 也可以遍历两遍:第一遍找到maxCount;第二遍记录count为maxCount的所有值
    • 对于不是二叉搜索树的,要先遍历一遍树,用map统计频率,把频率排个序,最后取前面高频的元素的集合。
      • 1.遍历树,用map统计频率
      • 2.把统计的出来的出现频率(即map中的value)排个序(要把map转化数组即vector,再进行排序)
      • 3.取前面高频的元素
    • 具体见代码随想录

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

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

相关文章

Microsoft edge浏览器对比谷歌浏览器 edge浏览器好用吗 edge浏览器怎么更换主页

近年来&#xff0c;由于谷歌浏览器的垄断&#xff0c;许多人都已经习惯于使用谷歌浏览器。随着互联网的普及&#xff0c;浏览器成为了人们上网必备的工具之一。而近年来&#xff0c;微软公司推出的 Microsoft Edge 浏览器备受关注。那么&#xff0c;Microsoft Edge 浏览器真的好…

idea运行tocmat报错

1.检查环境变量是否配置正确。 网上有许多配置tomcat环境变量的方法&#xff0c;这里不再赘述。 2.判断是否有该情况&#xff1a; 在tomcat的bin目录下有三个bat文件(startup.bat,shutdown.bat,catalina.bat)&#xff0c;随意双击一个&#xff0c;会报出上述错误。但是右键使…

基于SpringBoot的APK检测管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

Vanilla Pro for Mac 一款隐藏菜单栏图标工具

Vanilla Pro Vanilla Pro是一款简单易于使用的Mac应用程序&#xff0c;可让您隐藏菜单栏图标。只需下载Vanilla&#xff0c;启动应用程序&#xff0c;然后按照提示即可开始。 资源获取 Vanilla Pro for Mac 功能特性 键盘快捷键&#xff1a;设置自定义键盘快捷键来切换菜单…

关于pygame无法打开对应文件解决办法 pyame.error unable to open file

问题描述&#xff1a; 问题原因&#xff1a; 由于pygame版本过低导致无法进行声音播放&#xff0c;升级对应版本即可完成&#xff01; 解决办法&#xff1a; 升级pygame包版本到2.1.2&#xff0c;即可解决该问题&#xff01; pip install --upgrade pygame2.1.2

python3 数据分析项目案例,用python做数据分析案例

本篇文章给大家谈谈python3 数据分析项目案例&#xff0c;以及用python做数据分析案例&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 目录 一丶可视化绘图案例 1.曲线图 2.柱形图 3.点线图 4.3D散点图 5. 绘制漏斗图 6. 绘制词云图 二丶包/模块使用示例 (1)…

史上最详细由浅入深解析ThreadLocal

由浅入深全面解析ThreadLocal TOC 简介 线程并发&#xff1a;在多线程并发的场景下使用 传递数据&#xff1a;我们可以通过ThreadLocal在同一线程&#xff0c;不同组件中传递公共变量 线程隔离&#xff1a;每个线程的变量都是独立的&#xff0c;不会相互影响 基本使用 常用方…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

Ignite内存配置

配置内存 #1.内存架构 #1.1.概述 Ignite内存架构通过可以同时在内存和磁盘上存储和处理数据及索引&#xff0c;得到了支持磁盘持久化的内存级性能。 多层存储的运行方式类似于操作系统&#xff08;例如Linux&#xff09;的虚拟内存。但是这两种类型架构之间的主要区别是&…

Spring核心源码解析

Spring 框架核心源码 1、使用 Spring 框架 2、反射机制 IoC 控制反转 Inverse of Control 创建对象的权限&#xff0c;Java 程序中需要用到的对象不再由程序员自己创建&#xff0c;而是交给 IoC 容器来创建。 IoC 核心思想 1、pom.xml <dependencies><!-- 引入 …

lv12 根文件系统12

目录 1 根文件系统 2 BusyBox 3 实验九 3.1 在 busybox 官网下载 busybox 源码&#xff08;这里我们下载 busybox-1.22.1.tar.bz2&#xff09; 3.2 拷贝 busybox 源码包到 ubuntu 的家目录下&#xff0c;解压并进入其顶层目录 3.3 进入 busybox 配置界面&#xff08;…

数智金融技术峰会——金融行业大模型

金融行业大模型 奇富科技 马上消费金融 以标签为锚 2023腾讯最佳长论文 恒生电子 远距离的上下文关联 涌现能力的出现