leetcode 501 二叉搜索树中的众数

简介: leetcode 501 二叉搜索树中的众数

二叉搜索树中的众数


e70168f9689f49038e90e37e49df1ad6.png

任意二叉树map排序版

先遍历树,然后记录到map中。

之后将map存到vector中,因为map无法排序

对vector中pair的value排序

最后取最大的

/**
 * 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:
  //谓词,排序pair vector
    class compare
    {
        public:
        bool operator() (pair<int,int>p1 , pair<int,int>p2)
        {
            return p1.second > p2.second;
        }
    };
    unordered_map<int,int>my_map;
    //递归遍历
    void tarvelsal(TreeNode* cur)
    {
        if(cur==nullptr) return;
        tarvelsal(cur->left);
        my_map[cur->val]++;
        tarvelsal(cur->right);
    }
    vector<int> findMode(TreeNode* root) {
        vector<pair<int,int>> nums;
        vector<int> result;
        tarvelsal(root);
    //map复制到vector
        for(auto it:my_map)
        {
            nums.push_back(pair(it.first , it.second));
        }
        sort(nums.begin() , nums.end() , compare());
    //找最大的
        for(int i=0 ; i<nums.size() ; i++)
        {
            if(nums[i].second == nums[0].second ) result.push_back(nums[i].first);
        }
        return result;
    }
};

二叉搜索树

/**
 * 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:
  //当前值重复次数
    int count = 0;
    //最大值重复次数
    int max_count = 0;
    vector<int> result;
    TreeNode* pre = nullptr;
    //中序递归,二叉搜索树是从小到达排序
    void max_count_tree(TreeNode* cur)
    {
        if(cur == nullptr) return ;
        max_count_tree(cur->left);
        //如果当前次数是0,则是根节点,记录次数为1
        if(count==0) count=1;
        //如果当前值和旧值相同,次数加1
        else if(count!=0 && pre->val == cur->val) count++;
        //如果次数不为零,又发现当前值和旧值不同,则遇到新值。复位记录次数为1
        else count =1;
    //更新旧点
        pre = cur;
        //如果当前迭代次数和最大次数相同,此值加入结果
        if(count == max_count)
        {
            result.push_back(cur->val);
        }
    //如果当前次数大于之前的最大次数,则更新结果
    //之前的旧结果要清除,重新添加
        if(count > max_count)
        {
            max_count = count;
            result.clear();
            result.push_back(cur->val);
        }
        max_count_tree(cur->right);
    }
    vector<int> findMode(TreeNode* root) {
        max_count_tree(root);
        return result;
    }
};

二刷

/**
 * 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:
    vector<int> result;
    TreeNode* pre = nullptr;
    int num_times = 0 , max_times = 0;
    void track_back(TreeNode *cur)
    {
        if(cur == nullptr) return;
        track_back(cur->left);
        if(pre == nullptr)
        {
            num_times = 1;     
        }else if( pre->val == cur->val)
        {
            num_times++;
        }else if(pre->val != cur->val)
        {
            num_times = 1; 
        }
        if(num_times > max_times)
        {
            max_times = num_times;
            result.clear();
            result.push_back(cur->val);
        }else if(num_times == max_times)
        {
            result.push_back(cur->val);
        }
        pre = cur;
        track_back(cur->right);
    }
    vector<int> findMode(TreeNode* root) {
        track_back( root);
        return result;
    }
};
相关文章
|
3月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
16 1
|
3月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
20 1
|
3月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
45 0
|
3月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
13 0
|
3月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
22 0
|
3月前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
11 0
|
3月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
15 0
|
3月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
16 0
|
3月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
21 0
|
5月前
|
算法
LeetCode第96题不同的二叉搜索树
文章介绍了LeetCode第96题"不同的二叉搜索树"的解法,利用动态规划的思想和递推公式,通过计算以任意节点为根的不同二叉搜索树的数量,解决了该问题。
LeetCode第96题不同的二叉搜索树