题目描述
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
题目分析
首先我们遍历整个树,可以记录每个元素出现的次数(用map),然后对map进行排序,我们就能得到出现频率最高的元素。如下:
/**
* 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:
void traversal(TreeNode* cur, vector<int>& vec){
if(cur==NULL) return;
traversal(cur->left, vec);
vec.push_back(cur->val);
traversal(cur->right, vec);
}
bool static cmp_value(const pair<int, int>& left, const pair<int, int>& right){
return left.second > right.second;
}
public:
vector<int> findMode(TreeNode* root) {
vector<int> result;
vector<int> vec;
// 遍历二叉树
traversal(root, vec);
// 利用map记录每个元素出现的次数
unordered_map<int, int> map;
for(int i = 0; i < vec.size(); i++){
map[vec[i]]++; // 利用key记录出现的元素,value记录元素出现次数
}
// 根据value的大小对map进行排序
vector<pair<int, int>> vec2(map.begin(), map.end());
sort(vec2.begin(), vec2.end(), cmp_value); // 这里定义了自己的比较方法cmp_value
// 找map中value最大的元素
result.push_back(vec2[0].first);
// 因为众数可能不止一个,所以要看后面是否有key有一样的value
for(int i = 1; i < vec2.size(); i++){
if(vec2[i].second == vec2[0].second) result.push_back(vec2[i].first);
else break;
}
return result;
}
};
也可以在递归的同时就用map进行统计,修改后代码如下:
/**
* 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:
void traversal(TreeNode* cur, unordered_map<int, int>& map){
if(cur==NULL) return;
traversal(cur->left, map);
map[cur->val]++;
traversal(cur->right, map);
}
bool static cmp_value(const pair<int, int>& left, const pair<int, int>& right){
return left.second > right.second;
}
public:
vector<int> findMode(TreeNode* root) {
vector<int> result;
// 遍历二叉树
unordered_map<int, int> map;
traversal(root, map);
// 根据value的大小对map进行排序
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp_value); // 这里定义了自己的比较方法cmp_value
// 找map中value最大的元素
result.push_back(vec[0].first);
// 因为众数可能不止一个,所以要看后面是否有key有一样的value
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;
}
};