• 【20221103】【每日一题】二叉搜索树中的众数


    给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

    如果树中有不止一个众数,可以按 任意顺序 返回。

    假定 BST 满足如下定义:

    结点左子树中所含节点的值 小于等于 当前节点的值
    结点右子树中所含节点的值 大于等于 当前节点的值
    左子树和右子树都是二叉搜索树


    思路:利用二叉搜索树的性质,还是使用中序遍历,双指针去遍历,一边记录相同的数出现的次数,一边更新Maxcount,同时实时的更新result数组。

    1. class Solution {
    2. public:
    3. TreeNode* pre=NULL;
    4. vector<int> result;
    5. int Maxcount=0,count=0;
    6. void traversal(TreeNode* cur){
    7. //左中右 中序遍历
    8. if(cur==NULL) return;
    9. traversal(cur->left);//左
    10. //中
    11. if(pre==NULL) count=1;
    12. else if(pre->val==cur->val) count++;
    13. else count=1;
    14. pre=cur;
    15. if(count==Maxcount) result.push_back(cur->val);
    16. if(count>Maxcount){
    17. Maxcount=count;
    18. result.clear();
    19. result.push_back(cur->val);
    20. }
    21. traversal(cur->right);//右
    22. }
    23. vector<int> findMode(TreeNode* root) {
    24. traversal(root);
    25. return result;
    26. }
    27. };

    另外一个就是当不为二叉搜索树,也就是树无序的时候,可以用map来做。把map转化为vector直接构造时用迭代器就行了。分为以下几个步骤:

    1、遍历二叉树,把二叉树变为哈希表,其中key对应出现的值,value对应出现的频率;

    2、把哈希表再转成数组,注意这里转成数组时,vector放的是pair对;

    3、编写sort的排序规则,要加static,对数组进行排序;

    4、取第一个元素的second,并遍历数组找到相同的,都压入result中。


    暂时没有理解的是:在设置sort的排序规则的谓词时,要加上static,否则无法通过。

    1. class Solution {
    2. public:
    3. //遍历二叉树,把值都放进map中
    4. unordered_map<int,int> hash;
    5. void traversal(TreeNode* node){
    6. //因为无序,所以遍历顺序理论上也不重要
    7. if(node==NULL) return;
    8. traversal(node->left);
    9. hash[node->val]++;//map的key值对应出现的值,value对应出现的频率
    10. traversal(node->right);
    11. }
    12. //排序规则,按照频率由高到低排列
    13. bool static comp(const pair<int,int>& a,const pair<int,int>& b){
    14. return a.second>b.second;
    15. }
    16. vector<int> findMode(TreeNode* root) {
    17. traversal(root);
    18. //map无法对value进行排序,所以还得把map变成vector
    19. vectorint,int>> vec(hash.begin(),hash.end());
    20. //sort (起始迭代器,终止迭代器,谓词)
    21. sort(vec.begin(),vec.end(),comp);
    22. vector<int> result;
    23. result.push_back(vec[0].first);
    24. for(int i=1;isize();i++)
    25. {
    26. if(vec[i].second==vec[0].second)
    27. result.push_back(vec[i].first);
    28. }
    29. return result;
    30. }
    31. };

  • 相关阅读:
    Java教程之高阶源码分析-ConcurrentHashMap
    1.操作系统如何从BIOS到MBR的
    WIFI6 2.4G模组 WB800DC移植和替换RTL8723过程记录
    Impala优化,并发性能问题,压测
    computer architecture simulator汇总
    Git在VSCode中的使用
    CFA一级学习-CFA一级中文精讲(第三版)-第一章(1)
    高薪程序员&面试题精讲系列145之前后端如何交互?Swagger你用过吗?
    基于JavaWeb+SpringBoot+掌上社区疫苗微信小程序系统的设计和实现
    【英语:语法基础】B2.核心语法-动词
  • 原文地址:https://blog.csdn.net/HYAIWYH/article/details/127671457