题目链接
题目描述
给你一个含重复值的二叉搜索树(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有一样的valuefor(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有一样的valuefor(int i = 1; i < vec.size(); i++){if(vec[i].second == vec[0].second) result.push_back(vec[i].first);else break;}return result;}
};