力扣打卡第23天 二叉搜索树中的众数

501. 二叉搜索树中的众数

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

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

假定 BST 满足如下定义:

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

示例 1:

复制代码
输入:root = [1,null,2,2]
输出:[2]

示例 2:

复制代码
输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104]
  • -105 <= Node.val <= 105

方法一:当做普通的二叉树处理,用map

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void get_mp(TreeNode* root,unordered_map<int,int>& mp){
        if(root==nullptr)return;
        mp[root->val]++;
        if(root->left)get_mp(root->left,mp);
        if(root->right)get_mp(root->right,mp);
    }
    bool static cmp(pair<int,int> a,pair<int,int>b){//这里少了static就会报错
        return a.second>b.second;//seconde不用大括号后面
    }
    vector<int> findMode(TreeNode* root) {
        //肯定要用到map,但是进需要无须map即可,后面排序自己排
        unordered_map<int,int>mp;
        get_mp(root,mp);
        vector<pair<int, int>> vec(mp.begin(), mp.end());//mp不能排序,需要先转移到vec里面
        sort(vec.begin(),vec.end(),cmp);
        vector<int>res;
        res.push_back(vec[0].first);
        for(int i=1;i<vec.size();i++){
            if(vec[i].second==vec[0].second)res.push_back(vec[i].first);
        }
        return res;
    }
};

方法二:利用二叉搜索树性质

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    vector<int>res;
    TreeNode* pre;
    int max_count;
    int count;
    void get(TreeNode* root){
        if(root==nullptr)return ;
        if(root->left)get(root->left);//左
        //中
        if(pre==nullptr){
            count=1;
            pre=root;
        }
        else if(pre->val==root->val){
            count++;
            pre=root;
        }
        else{
            count=1;
            pre=root;
        }
        if(count>max_count){
            max_count=count;
            res.clear();
            res.push_back(root->val);
        }
        else if(count==max_count){
            res.push_back(root->val);
        }

        if(root->right)get(root->right);//右

    }
public:
    vector<int> findMode(TreeNode* root) {
        //利用二叉搜索树的性质(中序遍历有大小关系)
        max_count=0;
        pre=nullptr;
        count=0;
        res.clear();
        get(root);
        return res;
    }
};
相关推荐
☆5663 分钟前
C++中的代理模式高级应用
开发语言·c++·算法
2301_818419014 分钟前
编译器命令选项优化
开发语言·c++·算法
m0_518019484 分钟前
C++图形编程(OpenGL)
开发语言·c++·算法
Jasmine_llq5 分钟前
《B4354 [GESP202506 一级] 假期阅读》
数据结构·算法·最值筛选算法(核心逻辑)·三元运算符简化分支算法·多输入顺序处理算法·整数算术运算算法·格式化输出算法
2301_816651229 分钟前
自定义异常类设计
开发语言·c++·算法
weixin_421922699 分钟前
C++与自动驾驶系统
开发语言·c++·算法
算法鑫探13 分钟前
C语言结构体:学生信息统计实战
c语言·数据结构·算法·新人首发
爱吃生蚝的于勒17 分钟前
【Linux】网络之http协议
linux·运维·服务器·网络·数据结构·c++·http
2501_9454248019 分钟前
高性能计算资源调度
开发语言·c++·算法
Tisfy27 分钟前
LeetCode 1594.矩阵的最大非负积:动态规划O(mn)
leetcode·矩阵·动态规划·dp