力扣 501.二叉搜索树中的众数

501.做了几遍,还是没有把所有的情况考虑好。参考代码随想录的答案,一定要搞清楚:1、左中右“中”的时候怎么设置count,即在什么情况下怎么操作count?2、最终目的是把众数放vector,什么时候放?

问题1就是有3种情况:①.cur遍历第一个元素,此时pre是空,那么count代表cur那个元素值的频率,就是1;cur遍历的不是第一个元素,是情况②和③。②.cur和pre的值一样,说明cur还在一组连续的值当中,count应该++。③.cur和pre的值不一样,说明一组连续的值到pre为止了,count应该重置为1,重新从cur现在的值开始。

问题,当cur的值的频率≥maxCount,就应该放进vector。所以又是两种情况。①当你这个count比maxCount还要大的时候,表示更高的频率出现了,maxCount应该更新了。并且现在vector容器放的是以前旧的最高频率众数,应该清空(clear)以前的旧的,然后放新的进来。②如果就等于maxCount的话,说明cur的值的频率仍然是最大的,直接放进去就OK。代码如下:

class Solution {
public:
    TreeNode* pre=nullptr;
    vector<int> v;
    int maxCount=0,count=0;
    void traversal(TreeNode* cur){
        if(!cur)   return ;
        traversal(cur->left);
        //遍历设置count
        if(!pre||pre->val!=cur->val)count=1;
        else count++;
        //根据count判断
        if(count>maxCount){
            maxCount=count;
            v.clear();
            v.push_back(cur->val);
        }
        else if(count==maxCount)v.push_back(cur->val);
        pre=cur;
        traversal(cur->right);
    }
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return v;
    }
};

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值