算法day17|如何求普通二叉树的众数

算法day17|如何求普通二叉树的众数

501的变式:普通二叉树的众数

如果把二叉搜索树变成普通二叉树,我们该怎么思考呢?这个时候就要回到我一开始的思路了,用哈希表来解决问题。

cpp 复制代码
class Solution {
public:
    unordered_map<int,int> map;
    void traversal(TreeNode* root)
    {
        if(root==nullptr)
        return;
        map[root->val]++;
        traversal(root->left);
        traversal(root->right);
        return;
    }
    bool static cmp(pair<int,int>&a,pair<int,int>&b)
    {
        return a.second>b.second;
    }

    vector<int> findMode(TreeNode* root) {
        vector<int> result;
        if(root==nullptr)
        return result;
        traversal(root);
        vector<pair<int,int>> vec(map.begin(),map.end());
        sort(vec.begin(),vec.end(),cmp);
        result.push_back(vec[0].first);
        for(int i=1;i<vec.size();i++)
        {
            if(vec[i].second==vec[0].second)
            result.push_back(vec[i].first);
            else
            break;
        }
        return result;
    }
};

总体思路:

  • 首先,用哈希表来记录二叉树的元素及其个数
  • 其次,对哈希表进行排序。由于哈希表的值是不能直接实现排序的,所以我们要**先把哈希表整个存在vector<pair<int,int>>**中,然后用sort函数来对vector排序即可(另外,sort的排序规则是需要单独写的)
  • 排序之后取前面相同的项的键即可

代码细节:

  • 哈希表的插入
cpp 复制代码
map[root->val]++;

这是最简化的形式,map[键],中括号内是键,而map[键]整体就是对应的值,所以可以map["coffee"]=1;或者map[root->val]++;

  • pair<int,int>也是可以作为一种数据类型的,可以代入函数里面,也可以作为vector的数据类型。本质上和int、double没有区别

  • sort函数

cpp 复制代码
  sort(vec.begin(),vec.end(),cmp);

它有三个参数begin, end(区间左闭右开), cmp。其中,cmp参数为排序规则(cmp参数可以不写,如果不写的话,默认从小到大进行排序),如果是想要从大到小的排序,则需要写greater()(即:sort(begin,end,greater()))此处我们需要另写函数,因为数据类型比较特殊。

对于pair<int,int>,函数重写格式:

cpp 复制代码
  bool static cmp(pair<int,int>&a,pair<int,int>&b)
          {
              return a.second>b.second;
          }

函数开头的bool static要注意

  • 如果以vector作为函数返回值的话,不能返回null
相关推荐
iAkuya8 分钟前
(leetcode)力扣100 26环状链表2(双指针)
算法·leetcode·链表
sin_hielo10 分钟前
leetcode 2402(双堆模拟,小根堆)
数据结构·算法·leetcode
weixin_4617694018 分钟前
3. 无重复字符的最长子串
c++·算法·滑动窗口·最长字串
Morwit20 分钟前
【力扣hot100】 312. 戳气球(区间dp)
c++·算法·leetcode
CoovallyAIHub29 分钟前
摄像头如何“看懂”你的手势?手势识别实现新人机交互
深度学习·算法·计算机视觉
Q741_14742 分钟前
C++ 栈 模拟 力扣 394. 字符串解码 每日一题 题解
c++·算法·leetcode·模拟·
阿闽ooo43 分钟前
桥接模式实战:用万能遥控器控制多品牌电视
c++·设计模式·桥接模式
AI科技星1 小时前
张祥前统一场论:空间位移条数概念深度解析
数据结构·人工智能·经验分享·算法·计算机视觉
Wuliwuliii1 小时前
闵可夫斯基和、需存储的最小状态集
c++·算法·动态规划·闵可夫斯基和
CoovallyAIHub1 小时前
颠覆认知!遥感船舶检测“越深越好”是误区?LiM-YOLO证明“少即是多”
深度学习·算法·计算机视觉