日期:2023.12.23
参考:代码随想录、力扣
难度:简单
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
/**
* 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:
TreeNode* pre = nullptr;
vector<int> result;
int maxCount = 1;
int count = 1;
public:
vector<int> findMode(TreeNode* root) {
traversal(root);
return result;
}
void traversal(TreeNode* root) {
// 左中右
if (root == nullptr) return;
// 左
traversal(root->left);
// 中
if (pre != nullptr) {
if (root->val == pre->val) {
// 相等, count++
count++;
} else {
count = 1; // 重新置为1
}
}
pre = root;
if (count == maxCount) { // 如果当前计数与maxCount一致,说明可能是众数,放入数组中
result.push_back(root->val);
} else if (count > maxCount) { // 如果比maxCount大了,说明当前数才是新的众数,清空原来数组,加入当前数
maxCount = count;
result.clear();
result.push_back(root->val);
}
// 右
traversal(root->right);
}
};
时间复杂度:
空间复杂度: