501. 二叉搜索树中的众数

原题链接:501. 二叉搜索树中的众数

思路:
二叉搜索树,必然是有序的。
遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。
弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组)
频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

全代码:

class Solution {
public:
    int maxCount = 0; // 最大频率
    int count = 0; // 统计频率
    TreeNode* pre = NULL;
    void rev(TreeNode* Node, vector<int>& vec)
    {//中序获得树的所有值
        //左
        if (Node->left) rev(Node->left, vec);
        //中
        if(pre == NULL)
        {//第一个结点
            count = 1;
        }else if(pre ->val == Node ->val)
        {//与前一个结点值相同
            count++;
        }else
        {//与前一个结点值不同
            count = 1;
        }
        pre = Node;//更新上一个结点
        if(count == maxCount)
        {//如果最大值相同,放进vec容器中
            vec.push_back(Node ->val);
        }
        if(count > maxCount)
        {//如果计数器大于最大值频率,清空容器,让容器内的元素失效,再把计数器(最大值)push进容器内
            maxCount = count;
            vec.clear();
            vec.push_back(Node ->val);
        }
        //右
        if (Node->right)     rev(Node->right, vec);
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> vec;
        int count = 0,maxVlaue = 0;
        if(root == NULL) return vec;
        rev(root,vec);

        return vec;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值