501
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
树中节点的数目在范围 [1, 104] 内
-105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
class Solution {
public:
vector<int> nums;
void travelsal(TreeNode *cur, unordered_map<int, int> umap) {
if(cur == nullptr) {
return;
}
travelsal(cur -> left, umap);
// nums.push_back(cur -> val);
umap[cur -> val]++;
travelsal(cur -> right, umap);
}
bool static cmp(const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
vector<int> result;
if(root == nullptr) {
return result;
}
unordered_map<int, int> umap;
travelsal(root, umap);
vector<pair<int, int>> u(umap.begin(), umap.end());
sort(u.begin(), u.end(), cmp);
int maxCount = u[0].second;
result.push_back(u[0].first);
for(int i = 1; i < u.size(); i++) {
if(u[i].second == maxCount) {
result.push_back(u[i].first);
}
}
return result;
}
};
class Solution {
public:
int maxCount;
int count;
TreeNode *pre = nullptr;
void searchBST(TreeNode *cur, vector<int>& result) {
if(cur == nullptr) {
return;
}
searchBST(cur -> left, result);
if(pre == nullptr) {
count = 1;
}else if(cur -> val == pre -> val) {
count++;
}else {
count = 1;
}
if(count == maxCount) {
result.push_back(cur -> val);
}else if(count > maxCount) {
maxCount = count;
result.clear();
result.push_back(cur -> val);
}
pre = cur;
searchBST(cur -> right, result);
return;
}
vector<int> findMode(TreeNode* root) {
vector<int> result;
maxCount = INT_MIN;
count = 0;
if(root == nullptr) {
return result;
}
searchBST(root, result);
return result;
}
};

浙公网安备 33010602011771号