算法笔记 -- 501. 二叉搜索树中的众数

64 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

一、题目描述:

501. 二叉搜索树中的众数 - 力扣(LeetCode)

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

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

假定 BST 满足如下定义:

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

示例 1:

image.png

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 10^4] 内
  • -10^5 <= Node.val <= 10^5  

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

二、思路分析:

中序遍历二叉树,在map中记录每一个数和他们出现的频率,最后遍历两遍map,第一遍找到出现频率最高的数,第二遍将他们压入vector中。

三、AC 代码:

class Solution {
public:
    map<int, int> mp;       //记录每一个数和他们出现的频率
    map<int, int>::iterator it;
    vector<int> res;        //最终返回的结果,记录众数
    vector<int> findMode(TreeNode* root) {
        inOrderTraversal(root);
        int maxFrefuency = 0;
        for(it = mp.begin(); it != mp.end(); it++) {
            if(it -> second > maxFrefuency) {
                maxFrefuency = it -> second;
            }
        }
        for(it = mp.begin(); it != mp.end(); it++) {
            if(it -> second == maxFrefuency) {      //出现频率最高的数
                res.push_back(it -> first);         //记录在res中
            }
        }
        return res;
    }
    void inOrderTraversal(TreeNode* root) {
        if(root == NULL) return ;
        inOrderTraversal(root -> left);
        mp[root -> val]++;
        inOrderTraversal(root -> right);
    }
};

参考:

501. 二叉搜索树中的众数 题解 - 力扣(LeetCode)

ACM 选手图解 LeetCode 二叉搜索树中的众数(递归 + 非递归)| 编程文青李狗蛋 - 二叉搜索树中的众数 - 力扣(LeetCode)