LC 501.二叉搜索树中的众数

news2025/1/31 11:19:49

501.二叉搜索树中的众数

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

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

假定 BST 满足如下定义:

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点的数目在范围 [ 1 , 1 0 4 ] [1, 10^4] [1,104]
  • − 1 0 5 ≤ N o d e . v a l ≤ 1 0 5 -10^5 \leq Node.val \leq 10^5 105Node.val105

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

解法一(递归 + 中序遍历)

思路分析:

  1. 首先题目给出二叉搜索树的定义,因此可以使用中序遍历来遍历二叉树,从而得到一个有序的序列,然后根据该有序的序列寻找众数。
  2. 使用递归的方式来实现二叉搜索树的中序遍历
  3. 同时对于递归的返回值,为null,递归的参数则有二叉树的节点
  4. 对于递归的边界条件,若二叉树的节点为null,结束递归
  5. 对于递归的一般过程;则对该节点的值进行统计与判断
    1. 首先需要一个全局变量val来记录上一个节点的值,初始为root.val,然后使用一个全局变量num来统计对应val值出现的次数,初始为0
    2. 当遍历到某节点时,若该节点的值node.val == val,则++ num
    3. 若该节点的值不等于val,则将已经统计记录的valnum进行判断,另一个全局变量maxNum用于记录出现某值的最大次数
      1. num > maxNum,则出现新的众数,重新记录保存val
      2. num == maxNum,则将该众数继续保存到已有的记录中
      3. num < maxNum,则无需操作
    4. 当判断记录结束后,更新valnum

实现代码如下:

class Solution {
	int val;	// 用于记录中序遍历上一个节点的值
	int num;	// 用于记录值等于val的节点个数
	int maxNum;	// 用于记录num出现的最大值
	List<Integer> ans;	// 用于保存记录出现的众数
    public int[] findMode(TreeNode root) {
		val = root.val;	// 初始化为根节点
		ans = new LinkedList<>();
		doFindMode(root);
		updateAns();	// 再进行更新ans 防止漏掉序列最后连续的数值
		int[] arr = new int[ans.size()];
		for (int i = 0; i < ans.size(); ++ i) {
			arr[i] = ans.get(i);
		}
		return arr;
    }
	private void doFindMode(TreeNode node) {
		if (node == null)
			return ;
		doFindMode(node.left);		// 遍历左子树
		if (node.val == val) {
			++ num;
		} else {
			updateAns();	// 对列表进行更新
			val = node.val;
			num = 1;
		}
		doFindMode(node.right);		// 遍历右子树
	}
	private void updateAns() {
		if (num > maxNum) {
			ans.clear();	// 清除记录
			ans.add(val);	// 记录新的众数
			maxNum = num;	// 更新最大num
		} else if (num == maxNum) {
			ans.add(val);	// 增加新的众数
		}
	}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:43.9 MB,击败了28.46% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

深入浅出 -- 系统架构之在Java体系中的微服务标准组件

前面我们介绍了微服务架构的各个组件以及各组件的职责&#xff0c;在Java领域中&#xff0c;Spring可以说是无人不知无人不晓的&#xff0c;我们现代的企业级应用和互联网应用&#xff0c;很大一部分都是构建在Spring生态体系上的&#xff0c;同样&#xff0c;实现微服务架构的…

MySQL高级详解

文章目录 约束概述分类主键约束概述特点定义及删除主键自增 唯一约束作用语法 非空约束作用语法 面试题&#xff1a;非空唯一约束与主键约束有什么区别默认值约束作用语法 总结 表关系及外键约束表关系概述分类一对多关系表设计外键字段设计原则 多对多关系表设定设计原则 一对…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

一辆新能源汽车需要多少颗传感器?

随着科技的发展和环保意识的日益提高&#xff0c;新能源汽车&#xff08;包括纯电动汽车、混合动力汽车等&#xff09;在全球范围内越来越受到欢迎。这些汽车不仅减少了碳排放&#xff0c;还推动了汽车产业的创新。然而&#xff0c;这些高科技汽车的背后&#xff0c;隐藏着许多…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)

文章目录 前言&#xff1a;一、下载(一).链接&#xff08;直达JDK21&#xff09;(二).官网搜索&#xff08;可选其他版本&#xff09; 二、安装三、环境变量配置四、验证安装和配置五、常见问题解答 前言&#xff1a; 本文将为您提供关于Java官网下载JDK21版本的详细教程。作为…

springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案

不多说 直接上代码 第一步 package com.xxx.init.webFilter;import com.alibaba.fastjson.JSONObject; import com.xxx.api.constant.CommonConstant; import com.xxx.api.entities.log.OperationLog; import com.xxx.init.utils.JwtHelper; import com.xxx.init.utils.Reques…

King‘s AUTO的QI妙能力|实验室“总导演”

在2023年夏天&#xff0c;两场国际赛事分别在成都、杭州盛大举办——第31届世界大学生夏季运动会&#xff08;大运会&#xff09;以及第19届亚洲运动会&#xff08;亚运会&#xff09;。为确保开幕式的顺利进行&#xff0c;大运会共进行了三次全要素彩排&#xff0c;而亚运会则…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

【MATLAB源码-第185期】基于matlab的16QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

springboot如何切换内置web服务器?

切换内置web服务器 这是没有引入web依赖的服务 这是引入web依赖的服务 由此可知默认是tomcat服务器 那么如何切换内置服务器 只要有对应服务器的坐标即可自动切换&#xff0c;先排除tomcat再引入依赖&#xff0c;比如切换成jetty服务器 <dependency><groupId>org…

d3dx9_43.dll丢失的一些可行的解决方案,有效解决d3dx9_43.dll丢失

在电脑中&#xff0c;d3dx9_43.dll文件丢失是一个相当普遍的问题。实际上&#xff0c;要解决这个问题有多种方法。今天&#xff0c;我们将讨论一下关于d3dx9_43.dll文件丢失的问题&#xff0c;并向大家介绍一些可行的解决方案。 一.快速了解d3dx9_43.dll文件 首先&#xff0c;…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

2024-基于人工智能的药物设计方法研究-AIDD

AIDD docx 基于人工智能的药物设计方法研究 AI作为一种强大的数据挖掘和分析技术已经涉及新药研发的各个阶段&#xff0c;有望推动创新药物先导分子的筛选、设计和发现&#xff0c;但基于AI的数据驱动式创新药物设计和筛选方法仍存在若干亟待解决的问题。我们课题组的核心研究…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

服务器端口被扫会出现哪些风险

一、安全风险增加端口扫描是黑客攻击的常见手段之一。通过对服务器端口进行扫描&#xff0c;黑客可以了解服务器的开放端口、服务类型以及可能存在的漏洞。一旦黑客发现漏洞并成功利用&#xff0c;就可能导致服务器被入侵&#xff0c;进而窃取数据、植入恶意软件或进行其他非法…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤&#xff1a; 1、调整文件编码&#xff1a;确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下&#xff0c;使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

在keil里用c++编程(1)

做嵌入式开发时&#xff0c;我们对使用c语言写的库有强烈的需求&#xff0c;比如eigen&#xff0c;boost等&#xff0c;但是通常来说&#xff0c;我们的开发是围绕c语言进行的&#xff0c;怎么把c的库文件放在c语言环境下进行编译&#xff0c;就是我们需要面对的问题 1.问题来…