501. 二叉搜索树中的众数

news2025/2/22 4:04:26

501. 二叉搜索树中的众数

难度简单

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

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

假定 BST 满足如下定义:

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

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

思路 

  • 使用maxCount变量记录二叉搜索树的最大众数个数,使用count记录二叉搜索树的数字个数
  • 使用一个前驱节点prev,记得一般利用二叉搜索树的中序遍历有序性一般都要有prev,因为要让当前节点与前驱节点值比较
  • 当 前驱结点值与当前节点的值相同时候,该数字个数++,否则为该数字个数1
  • 当数字个数=最大众数个数,就将其节点值加进list中
  • 因为有可能遍历其他节点值的时候,个数超过原先众数最大值,所以这时要将list清空,重新把当前节点加入list,然后重新更新maxCount

本题依然利用二叉搜索树的中序遍历的有序性(为递增的).记得要用前驱指针奥.

迭代

class Solution {
    private List<Integer> res = new ArrayList<>();
    private int maxCount = 0;//记录二叉搜索树中的最大众数个数
    private int count = 0;//记录二叉搜索树中每一个数字的个数
    private TreeNode prev = null;//前驱节点,用于与当前节点比较,如果相等,count++;该数字个数+1
    private void dfs(TreeNode root) {
        if(root==null) return;
        //进行中序遍历,还是利用二叉搜索树的特性,中序遍历 的序列是递增的
        dfs(root.left);
        if(prev==null){//如果前驱节点为null,该数字个数为1
            count = 1;
        }else {
            if(prev.val==root.val){//如果当前节点与前驱节点的值相等,该数字个数+1
                count++;
            }else {//如果当前节点与前驱节点的值不相等,该数字个数为1
                count = 1;
            }
        }
        prev = root;//遍历到下一个节点的时候,更新前驱节点
        if(count==maxCount){//如果当前数字个数=最大众数个数,把它加到list中
            res.add(root.val);
        }
        if(count>maxCount) {
            //如果当前数字个数>最大众数个数,清空list,把当前节点加入list,同时更新maxCount
            res.clear();
            res.add(root.val);
            maxCount = count;
        }
        dfs(root.right);
    }
    public int[] findMode(TreeNode root) {
        dfs(root);
        int[] array = new int[res.size()];
        for(int i =0;i<res.size();++i){
            array[i] = res.get(i);
        }
        return array;
    }
}

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

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

相关文章

Effective C++条款38:通过复合塑模出 has-a 或“根据某物实现出“

Effective C条款38&#xff1a;通过复合塑模出 has-a 或"根据某物实现出"&#xff08;Model "has-a" or "is-implemented-in-terms-of" through composition&#xff09;条款38&#xff1a;通过复合塑模出 has-a 或"根据某物实现出"1、…

Batch Normalization

1、原理 在图像预处理过程中会对图像进行标准化处理&#xff0c;这样能够加速网络的收敛速度。 如下图所示&#xff0c;对于Conv1来说输入的是满足某一分布的特征矩阵&#xff0c;但对于Conv2来说输入的feature map就不一定满足某一分布规律。 Batch Normalization的目的就是使…

大坝安全在线监控系统包含哪些内容?怎样提升水库大坝信息化管理水平?

平升电子大坝安全在线监控系统根据SL551-2012《土石坝安全监测技术规范》的整编要求&#xff0c;设置了变形监测、渗流监测、环境量监测。大坝安全在线监控系统可及时了解大坝的工作性态和水库可能存在的事故隐患&#xff0c;为大坝安全管理与水库运行调度提供了准确、及时的现…

Elasticsearch集群搭建

前言在如今的开发过程中&#xff0c;单节点的Elasticsearch肯定是支撑不了大数据量的&#xff0c;而且还存在单节点故障的问题&#xff0c;所以Elasticsearch也提供了集群功能&#xff0c;像其他中间件也基本都会考虑到这个问题准备信息首先&#xff0c; 由于我机器有限&#x…

如何在虚拟机上安装Linx系统

前言作为Java开发的我们&#xff0c;可能有时候想自己玩玩linux服务器&#xff0c;但是如果买阿里云或者腾讯云的服务器又很贵&#xff0c;这时候我们就可以在自己电脑上安装虚拟机了&#xff0c;这也是本篇文章出现的原因&#xff0c;下面我就安装centOS7为例子来进行介绍首先…

openEuler资源利用率提升之道 05:虚机混部介绍与功耗管理技术

随着云计算市场规模的快速增长&#xff0c;各云厂商基础设施投入也不断增加&#xff0c;但行业普遍存在资源利用率低的问题&#xff0c;在上述背景下&#xff0c;提升资源利用率已经成为了一个重要的技术课题。将业务区分优先级混合部署(下文简称混部)是典型有效的资源利用率提…

【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

我们在学习结构体之后&#xff0c;就可以尝试去实现通讯录的制作&#xff0c;如果您这边对于结构体还没有太多的认识的话&#xff0c;请先访问这一篇文章,会有利于接下来的学习。【自定义类型】带你走进结构体、枚举、联合_小王学代码的博客-CSDN博客 目录 一、通讯录 二、静…

JVM-【面试题】-对象内存分配

一、对象内存分配流程图如果能在栈分布就直接在栈创建如果是大对象就直接在old区创建如果不大于TLAB则在TLAB创建&#xff0c;否则在Eden区创建如果Eden区空间不足就会发生Minor GC进行回收&#xff0c;回收的空间放不下或年龄达到上限就直接放到Old区&#xff0c;之后S0区的存…

Vue3.0 性能提升主要是通过哪几方面体现的?

一、编译阶段 回顾Vue2&#xff0c;每个组件实例都对应一个 watcher 实例&#xff0c;它会在组件渲染的过程中把用到的数据property记录为依赖&#xff0c;当依赖发生改变&#xff0c;触发setter&#xff0c;则会通知watcher&#xff0c;从而使关联的组件重新渲染 试想一下&…

34420A万用表

18320918653 34420A Agilent 34420A 七位半台式数字万用表|安捷伦纳伏表34420A|微欧表|安捷伦34420A 品牌&#xff1a; Agilent(安捷伦) 1.3nV rms噪声/8n Vp-p 100pV&#xff0c;100nΩ灵敏度 两通道可编程电压输入&#xff1a;差分和比值功能 71/2位分辨率 1mV到100V量程…

如何通过指令控制将一副扑克牌变成一种简单的计算机

题目 题目就是文章的标题 已知 牌数&#xff1a;每套扑克牌有54张&#xff0c;其中去掉大小王&#xff0c;剩下52张&#xff0c;这52张中又有4种花色黑桃&#xff0c;红桃&#xff0c;梅花&#xff0c;方片每种花色都有13张&#xff08;1,2,3,4,5,6,7,8,9,10,J,Q,K&#xff…

【Ubuntu】在VMWare虚拟机中安装Ubuntu【教程】

文章目录【Ubuntu】在VMWare虚拟机中安装Ubuntu教程一、安装VMWare二、下载Ubuntu的iso文件三、安装UbuntuReference【Ubuntu】在VMWare虚拟机中安装Ubuntu教程 一、安装VMWare 具体的安装方法&#xff0c;可以参考这一篇博客&#xff0c;这里就不详细介绍了 二、下载Ubuntu…

centos禁止root登录

ssh登录linux服务器的时候&#xff0c;经常会有提示 There were * failed login attempts since the last successful login. 说明有大量的非法登录尝试 检查服务器是否被恶意登录 # Ubuntu # 1. 查看近期成功的密码登录&#xff1a; grep "password" /var/log/au…

如何搭建邮箱服务器?mail系统架设的两种方法

邮件mail通信是常用的办公场景&#xff0c;对于技术和网管等人员&#xff0c;往往需要搭建自己的邮箱服务器。那么&#xff0c;如何架设邮箱系统呢&#xff1f;通常有两种方案&#xff0c;一种是在在本地主机部署&#xff0c;另一种是在云端如云服务器上部署应用。根据主机IP情…

以交互方式导入图像、音频和视频

以交互方式将数据导入到 MATLAB 工作区。 查看文件的内容 指定变量 生成可重用的 MATLAB 代码 注意&#xff1a;​有关导入文本文件的信息&#xff0c;可以参考使用导入工具读取文本文件数据。有关导入电子表格的信息&#xff0c;可以参考使用导入工具读取电子表格数据。 查…

【Redis数据对象与结构】string与其底层结构

【Redis数据对象与结构】string与其底层结构 【Redis数据对象与结构】系列的主线如下&#xff0c;本文主要讲解string数据对象及其底层结构在redis中的实现。 redis中基本的数据对象有字符串类型(String)、列表类型(List)、字典类型(Hash)、集合类型(Set)、有序列表类型(Sorte…

自定义类型之枚举与联合

文章目录前言一、枚举1.枚举的定义2.枚举的几种情况3.枚举类型的大小4.枚举的优点二、联合&#xff08;共用体&#xff09;1.联合类型的定义2.联合的特点3.联合的大小计算总结前言 自定义类型很多人可能只知道结构体&#xff0c;因为结构体相对来说确实用的比较多&#xff0c;而…

爬虫攻守道 - 2023最新 - 正则表达式勇猛精进 - 爬取某天气网站历史数据

前言 在 正则表达式 - 匹配开头、结尾、中间 - 某天气网站网页源代码分析 这篇文章里&#xff0c;我们介绍了如何用正则表达式匹配包含特定样式的Table标签&#xff0c;也就是同时匹配开头、结尾、以及中间。 当你能真正理解这个写法&#xff0c;就会觉得不过是柳暗花明罢了。…

如何把拍摄视频中多余的人或物去除?

大家应该都有这样一个烦恼吧&#xff1f;就是拍摄的一段视频中有多余的人物出现&#xff0c;想要把里面的人物去除掉&#xff0c;或者是自己拍摄的一段视频&#xff0c;视频里出现了多余的人物&#xff0c;但是又不能重启拍摄的情况下&#xff0c;想要把视频中的人物去除掉应该…

Spring Security笔记

创建个项目 引入Spring Web和Spring Security 即可 写个Controller接收请求 转发重定向都可以 static下定义两个页面 login.html页面 用来登录 main.html如果可以跳到这里,说明登录成功 启动运行程序 我们访问登录接口 或者是访问静态资源都会重定向到这个页面 这个页面说…