持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
题目
501. 二叉搜索树中的众数
难度简单467
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入: root = [1,null,2,2]
输出: [2]
示例 2:
输入: root = [0]
输出: [0]
提示:
- 树中节点的数目在范围
[1, 104]内 -105 <= Node.val <= 105
进阶: 你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路一
1.用map来计算二叉树值出现的频率
2.然后对map进行排序
3.遍历map数组找出和最大出现频率一致的值
代码一
class Solution {
public:
//用map统计频率
void searchBST(TreeNode*cur, unordered_map<int, int>&map) {
if (cur == nullptr) return;
map[cur->val]++;
//先序遍历
searchBST(cur->left, map);
searchBST(cur->right, map);
return;
}
//对map的排序
bool static cmp(const pair<int, int> &a, const pair<int, int> &b) {
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
unordered_map<int, int> map;
vector<int> result;
if (root == nullptr) return result;
searchBST(root, map);
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(),cmp);
result.push_back(vec[0].first);
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;
}
};
思路二.
因为是二叉搜索树,在中序遍历的同时相邻的两个元素作比较,然后输出频率最高的元素 那么不用map如何输出频率最高的元素呢,pre(前指针)cur(后指针)
代码二.
class Solution {
public:
int maxcount; //最大频率
int count; //更新频率
TreeNode*pre;
vector<int> result;
void searchBST(TreeNode*cur) {
if (cur == nullptr) return;
searchBST(cur->left);
if (pre == nullptr) count = 1; //第一个节点出现的频率为1
else if (pre->val == cur->val) count++;
else count = 1;
pre = cur; //更新节点
if (count == maxcount) result.push_back(cur->val);
if (count > maxcount) {
maxcount = count;
result.clear(); //很关键的一步,因为时时都会出现新的频率的更新所以当有高一点的频率时,便更新之前的值。
result.push_back(cur->val);
}
searchBST(cur->right);
return;
}
vector<int> findMode(TreeNode* root) {
count = 0;
maxcount = 0;
TreeNode*pre = nullptr;
searchBST(root);
return result;
}
};