( “树” 之 BST) 501. 二叉搜索树中的众数 ——【Leetcode每日一题】

news/2024/10/11 15:39:50/

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。
二叉查找树中序遍历有序。

❓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 <= Node.val <= 10^5 105<=Node.val<=105

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

💡思路:

中序遍历,边遍历边统计:

要设置三个变量:curCnt表示当前个数;maxCnt表示最大个数;preNode表示前一个结点:

  • 如果当前结点值等于前一个结点值,则curCnt++,否则curCnt置为1重新计数;
  • 如果当前个数curCnt大于最大个数maxCnt,则将数组清空,添加当前节点值;
  • 如果当前个数curCnt大于最大个数maxCnt,则不需要清空,在数组后面添加就行;

🍁代码:(Java、C++)

Java

class Solution {private int curCnt = 1;private int maxCnt = 1;private TreeNode preNode = null;public int[] findMode(TreeNode root) {List<Integer> maxCntNums = new ArrayList<>();inOrder(root, maxCntNums);int[] ret = new int[maxCntNums.size()];int idx = 0;for (int num : maxCntNums) {ret[idx++] = num;}return ret;}private void inOrder(TreeNode node, List<Integer> nums) {if (node == null) return;inOrder(node.left, nums);if (preNode != null) {if (preNode.val == node.val) curCnt++;else curCnt = 1;}if (curCnt > maxCnt) {maxCnt = curCnt;nums.clear();nums.add(node.val);} else if (curCnt == maxCnt) {nums.add(node.val);}preNode = node;inOrder(node.right, nums);}
}

C++

class Solution {
public:int curCnt = 1;int maxCnt = 1;TreeNode* preNode = nullptr;vector<int> findMode(TreeNode* root) {vector<int> ans;inOrder(root, ans);return ans;}void inOrder(TreeNode* root, vector<int>& ans){if(root == nullptr) return;inOrder(root->left, ans);if(preNode != nullptr){if(root->val == preNode->val) curCnt++;else curCnt = 1;}if(curCnt > maxCnt){maxCnt = curCnt;ans.clear();ans.push_back(root->val);}else if(curCnt == maxCnt){ans.push_back(root->val);}preNode = root;inOrder(root->right, ans);}
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n):即遍历这棵树的复杂度。
  • 空间复杂度 O ( 1 ) O(1) O(1):如果调用栈的开销不被计算在内,储存结果的数组也不计算,空间复杂度为 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!


http://www.ppmy.cn/news/52718.html

相关文章

有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetco…

Spring Bean生命周期源码详解

文章目录 Bean生命周期源码生成BeanDefinitionSpring容器启动时创建单例Bean合并BeanDefinitiongetBean()方法加载类实例化前实例化BeanDefinition的后置处理实例化后依赖注入执行Aware回调初始化前初始化初始化后销毁逻辑 Bean生命周期源码 我们创建一个ApplicationContext对…

Elasticsearch简单搜索以及聚合分析

1.批量索引文档 如果你有大量文档要索引&#xff0c;你能通过批量 API&#xff08;bulk API&#xff09; 来批量提交它们。批量文档操作比单独提交请求显著更快&#xff0c;因为它极简了网络往返。 最佳的批量数量取决于许多因素&#xff1a;文档的大小和复杂度、索引和搜索的…

OJ练习第84题——按字典序排在最后的子串

按字典序排在最后的子串 力扣链接&#xff1a;1163. 按字典序排在最后的子串 题目描述 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 示例 1&#xff1a; 输入&#xff1a;s “abab” 输出&#xff1a;“bab…

5.2 构造数值积分公式的基本方法与有关概念的例题分析

书上例题&#xff1a; 例3 确定求积公式 中的系数&#xff0c;使其具有尽可能高的代数精度。 我的答案&#xff1a; 一、信息 1.给了我一个求积公式 2.确定求积公式中的系数 3.使得这个求积系数具有尽可能高的代数精度。 二、分析 条件1&#xff1a;告诉我这个求积公…

全新推出!赛宁BAS智能安全验证,让企业安全系统坚如磐石

赛宁BAS智能安全验证系统&#xff0c;可以通过模拟网络攻击来检验安全防御手段有效性&#xff0c;量化安全风险并给出安全加固建议&#xff0c;帮助行业客户降低安全运营成本&#xff0c;提升网络安全防御能力。 一、解析安全防御现状 在合规时代背景下&#xff0c;虽然大部分…

AI 时代的学习方式: 和文档对话

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

WeakHashMap的应用场景

WeakHashMap&#xff0c;从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除&#xff0c;即使程序员没有调用remove()或者clear()方法。 1、适用于缓存场景 更直观的说&#xff0c;当使用 WeakHashMap 时&#xff0c;即使没有显示的添加或…