当前位置:首页 > 力扣 > 力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

11个月前 (05-30)

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界 二叉搜索树 二叉树 二叉树遍历 数据结构 算法 中序遍历 深搜 映射 第1张

题目解读‌:
二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索本身具有左小右大的特性,这为我们解决问题提供了天然的便利。题目要求我们找出所有出现次数最多的元素,当多个数字出现次数相同时,需要全部返回。

解题思路‌:
采用中序遍历+频率统计的经典解法。首先通过中序遍历将BST的所有节点值按升序存入数组,这个过程中BST的有序特性得到了充分利用。接着,代码使用一个足够大的数组来统计每个数值出现的频率,这里巧妙地将数值范围[-100000,100000]映射到数组索引[0,200000]。统计完所有数值的频率后,找出最大出现次数,最后收集所有达到这个最大次数的数值。这种方法虽然使用了额外空间,但思路清晰,实现简单,是解决此类问题的典型范例。

代码注释:

class Solution {
public:
    vector<int> tree; // 存储中序遍历结果的容器
    int sum[200001]={0}; // 频率统计数组,覆盖[-100000,100000]范围
    
    // 中序遍历二叉搜索树
    void inorder(TreeNode* root) {
        if(!root) return; // 递归终止条件
        inorder(root->left); // 遍历左子树
        tree.push_back(root->val); // 将当前节点值加入数组
        inorder(root->right); // 遍历右子树
    }
    
    vector<int> findMode(TreeNode* root) {
        vector<int> ret; // 结果容器
        inorder(root); // 执行中序遍历
        
        // 统计每个数值出现的频率
        for(int i=0;i<tree.size();i++)
            sum[tree[i]+100000]++; // 数值+100000映射到数组索引
            
        int maxsum=0; // 记录最大出现次数
        // 找出最大出现次数
        for(int i=0;i<200001;i++)
            maxsum=max(maxsum,sum[i]);
            
        // 收集所有出现次数等于maxsum的数值
        for(int i=0;i<200001;i++)
            if(sum[i]==maxsum) ret.push_back(i-100000); // 还原原始数值
            
        return ret; // 返回结果
    }
};


参考:力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣912排序题终极解法:递归分割 + 双指针合并详解

力扣912排序题终极解法:递归分割 + 双指针合并详解

题目解读给定一个整数数组,要求将其按升序排列并返回。题目通常隐含对算法时间复杂度的要求,理想情况下需实现 O(n log n) 的时间复杂度。本题看似简单,但需要选择合适的排序算法(如归并排序、快速排...

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

手把手教你理解单向链表:代码注释+新手入门指南

一、简介和应用单向链表是一种基础的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这种结构在数据存储和动态操作中非常实用,例如实现队列、栈,或在需要频繁插入、删除的场景中(如用户...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。