Leetcode 501 二叉搜索树中的众数

题意理解

首先明确:  二叉搜索树中序遍历是严格的单调递增序列,也就是说,传统意义上得到二叉搜索树不存在相同的数,也不可能存在众数。

所以:        这里的二叉搜索树不是严格意义上的二叉搜索树,它允许重复的值,其中序遍历是不严格的单调增的序列。

又因为:     二叉搜索树是不严格的单调增序列,所以其相同的值总是挨着的

所以:         我们能从前后不相同的两个值为一个起始点,统计相同数的个数

所以:         我们能维护一个最大的count在整个遍历在整个过程中,并保存对应的元素值

解题思路

        对应两种树的遍历思路: 递归        迭代

1.递归

中间节点的处理逻辑是:

pre的值等于cur的值时,统计当前元素的count,否则count开启重置count=1

对maxCount进行更新:

        若当前count==maxCount,则当前root的值进入结果集

        若当前count>maxCount,则当前结果集清空,root的值进入结果集,maxCount=count,值更新

        若当前count<maxCount,无操作

/*** 这里找二叉搜索树的众数,首先明确,正常的二叉搜索数不存在重复的数据,其中序遍历是严格单调增序列* 所以,这里的二叉树是非常规的二叉树,它允许重复的值,重复的值总是存在于左子树* 同时又因为二叉搜索树中序遍历是有序的,所以重复的数总是挨着的,可以一个起始点开始count++,统计出现次数* @param root* @return*///保存结果List<Integer> resultList=new ArrayList<>();//双指针,是想前一个节点TreeNode pre=null;//记录当前元素重复次数int count=0;//记录最大重复次数int maxCount=0;//递归解法public int[] findMode(TreeNode root) {//中序遍历//左子树处理if(Objects.nonNull(root.left)) findMode(root.left);//中间节点处理if(pre==null||pre.val!=root.val){count=1;}else{count++;}//最大count更新if(maxCount<count){resultList.clear();resultList.add(root.val);maxCount=Math.max(maxCount,count);}else if(maxCount==count){resultList.add(root.val);}//  节点推移pre=root;//右子树处理if(Objects.nonNull(root.right)) findMode(root.right);//list转数组return resultList.stream().mapToInt(Integer::intValue).toArray();}

2.迭代

迭代和递归的中间处理逻辑是相同的,只是使用自定义栈来模拟递归过程,来防止栈溢出

//迭代解法public int[] findMode2(TreeNode root){List<Integer> resultList=new ArrayList<>();//双指针,是想前一个节点TreeNode pre=null;//记录当前元素重复次数int count=0;//记录最大重复次数int maxCount=0;//自定义栈Stack<TreeNode> stack=new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode cur=stack.peek();if(cur!=null){stack.pop();//中序入栈,有因为栈总是先进后出的,所以以一下顺序入栈//对子树进行非空判断后入栈,则子树不会导致null值入栈//手动null值入栈,是一个信号,即下一个值为中间节点,一定是非空的,进行识别并处理if(Objects.nonNull(cur.right)) stack.push(cur.right);stack.push(cur);stack.push(null);if(Objects.nonNull(cur.left)) stack.push(cur.left);}else{stack.pop();cur=stack.pop();//获得中间节点,中间节点的处理逻辑if(pre==null||pre.val!=cur.val) count=1;else count++;if(maxCount==count){resultList.add(cur.val);} else if (maxCount<count) {resultList.clear();resultList.add(cur.val);maxCount=count;}pre=cur;}}return resultList.stream().mapToInt(Integer::intValue).toArray();}

3.分析

时间复杂度:

        递归:O(n)

        迭代:O(n)

空间复杂度:

        递归:O(1)

        迭代:O(n)

        

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

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

相关文章

PVE中CT容器安装openwrt X86的极简方法

下载推荐&#xff1a;https://openwrt.ai/ 使用环境PVE8.0&#xff0c;openwrt是以上网址的最新版&#xff0c;内涵及其丰富组件。 问题来源&#xff1a; 在PVE虚拟机可以很方便的使用img文件&#xff0c;转换qm 成一个硬盘文件&#xff0c;加入到虚拟机也就完成了&#xff0c…

五、双向NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 双向NAT1.1.基本原理1.2.NAT Inbound NAT Server1.3.域内NATNAT Server —————————————————————————————————————————————————— 双向NAT 经过前面介绍&#xff0c;…

fiddler设置手机端抓包看这篇文章就足够了,轻松解决!

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff0c;点…

【Linux】coredump 文件的例子分析

1. 生成 core 文件 网上很多教程&#xff0c;我这里举一种 临时开启 生成 core 文件 # 0 就是没有开 coredump 功能 rootswd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ulimit -c 0 # 设置值临时为 unlimited rootswd-Lenovo-G40-80:/home/swd/pros/c--le…

Java基础之常用类

Java基础之常用类 一、包装类1.1、Java基本数据类型及其对应的包装类1.2、包装类的自动装箱、自动拆箱机制1.3、包装类的优点 二、String类三、StringBuffer类和StringBuilder类3.1、主要区别&#xff1a;3.2、StringBuffer/StringBuilder用法(两者用法一致) 四、日期类4.1、Da…

setLineWrapMode 是 QTextEdit 类的成员函数,用于设置文本换行模式(Line Wrap Mode)

setLineWrapMode 是 QTextEdit 类的成员函数&#xff0c;用于设置文本换行模式&#xff08;Line Wrap Mode&#xff09;。 在 Qt 中&#xff0c;文本换行模式指定了文本编辑器中长行文本的显示方式。通过设置不同的换行模式&#xff0c;可以控制是否自动换行、如何换行以及是否…

[DASCTF 2023 0X401七月暑期挑战赛] web刷题记录

文章目录 EzFlask方法一 python原型链污染方法二 flask框架静态文件方法三 pin码计算 MyPicDisk方法一 字符串拼接执行命令方法二 phar反序列化 ez_cms EzFlask 考点&#xff1a;python原型链污染、flask框架理解、pin码计算 源码如下 import uuidfrom flask import Flask, re…

企业源代码防泄密的有什么痛点及难点?

安秉信息作为源代码防泄密的方案的提供商&#xff0c;对企业源代码防泄密有深入的了解。在企业中可以对普通 的文件&#xff0c;图纸进行加密保护这些文件的泄漏。但是企业管理者对于企业的源代码文件防泄密却没有更好的管理方案。 源代码防泄密最大的痛点是&#xff0c;现在企…

近五年—中国十大科技进展(2018年—2022年)

近五年—中国十大科技进展&#xff08;2018-2022&#xff09; 2022年中国十大科技进展1. 中国天眼FAST取得系列重要进展2. 中国空间站完成在轨建造并取得一系列重大进展3. 我国科学家发现玉米和水稻增产关键基因4. 科学家首次发现并证实玻色子奇异金属5. 我国科学家将二氧化碳人…

uni-app 微信小程序 pdf预览

<div click"getPDF">查看体检报告</div>getPDF() {uni.downloadFile({url: ${this.$baseURL}/file/download?id${this.pdfFileId},//编写在线的pdf地址success: function(res) {const filePath res.tempFilePath;uni.openDocument({filePath: filePath…

java stream流map和flatmap的区别

map和flatmap都是用来转换操作。 map()操作后的流与原始流的元素个数一一对应&#xff0c;一对一地进行元素转换&#xff0c;适用于对每个元素进行简单的转换操作&#xff0c;例如将元素的属性提取出来或进行数值计算。 flatMap()操作是一对多的元素转换&#xff0c;对于每个输…

Roll-A-Ball 游戏

Roll-A-Ball 游戏 1&#xff09;学习资料 b站视频教程&#xff1a;https://www.bilibili.com/video/BV18W411671S/文档&#xff1a; * Roll-A-Ball 教程&#xff08;一)&#xff0c; * Roll-A-Ball 教程&#xff08;二)线上体验roll-a-ball成品 * http://www-personal.umich.e…

使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】

将sRGB格式的图片转换为BT.2020格式涉及到两个步骤&#xff1a;首先将sRGB转换到线性RGB&#xff0c;然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正&#xff0c;而BT.2020工作在线性色彩空间中。 从sRGB到线性RGB&#xff1a;sRGB图像首先需要进行伽马校正解码…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别&#xff1f;Spring AOP中的动态代理如何理解 Spring 中的代理&#xff1f;解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知&#xff1a;什么是切面 Aspe…

scoop bucket qq脚本分析(qq绿色安装包制作)

url字段 以qq.json为例&#xff0c;其对应的scoop配置文件在$env:scoop\buckets\extras\bucket\qq.json 其中的url字段 "url":"https://webcdn.m.qq.com/spcmgr/download/QQ9.7.17.29230.exe#/dl.7z"为qq安装包下载地址&#xff0c;后缀#/dl.7z为自行添加…

第八节HarmonyOS @Component自定义组件的生命周期

在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 1、自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 2、页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定…

函数递归所应满足的条件

1.递归的概念 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 递归的思想&#xff1a; 把⼀个⼤型复杂问题层层转化为⼀个与原问题相似&#xff0c;但…

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用【鸿蒙专栏-05】

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用 HarmonyOS,作为一款全场景分布式操作系统,为了推动更广泛的应用开发,采用了一种先进而灵活的编程语言——ArkTS。ArkTS是在TypeScript(TS)的基础上发展而来,为HarmonyOS提供了丰富的应用开发工具,使开…

mybatis <include refid=“xxx“></include>

&#xff1c;include refid"xxx"&#xff1e;&#xff1c;/include&#xff1e;使用在查询字段&#xff0c;多个select查询语句&#xff0c;可能查询的字段是相同的&#xff0c;就可以用这个标签把需要查询的字段抽出来。 <sql id"org_id">id,code,…

判断数组里面的元素是否都为某个数——C++ 算法库(std::all_of)

函数功能:检测表达式是否对范围[first, last)中所有元素都返回true,如果都满足,则返回true。 该函数对整个数组元素进行操作,可以节省运行循环来逐一检查每个元素的时间。 它检查每个元素上的给定属性,并在范围内的每个元素满足指定属性时返回 true,否则返回 false。 语…