
cpp
class Solution {
public:
void Traversal(TreeNode* root, unordered_map<int, int>& m) {
if (root == nullptr) return;
m[root->val]++;
Traversal(root->left, m);
Traversal(root->right, m);
}
vector<int> findMode(TreeNode* root) {
unordered_map<int, int> m;
Traversal(root, m);
// 找最大出现次数(正确遍历 map)
int maxCount = 0;
for (auto& pair : m) {
maxCount = max(maxCount, pair.second);
}
// 收集所有众数
vector<int> res;
for (auto& pair : m) {
if (pair.second == maxCount) {
res.push_back(pair.first);
}
}
return res;
}
};
递归使用map存放出现的次数,然后进行遍历放入数组中,时间复杂度为O(N)

cpp
class Solution {
public:
int count,maxcount;
TreeNode*pre=nullptr;
vector<int> vec;
void searchBST(TreeNode*root)
{
if(root==NULL) return;
searchBST(root->left);
//因为是二叉搜索树,所以都是邻近比较
if(pre==NULL)
{
count=1;
}
else if(pre->val==root->val)
{
count++;
}
else//重新值一
{
count=1;
}
pre=root;
if(count==maxcount)//目前的最大值插入
{
vec.push_back(root->val);
}
if(count>maxcount)
{
maxcount=count;
vec.clear();//之前的值都作废
vec.push_back(root->val);
}
searchBST(root->right);
return;
}
vector<int> findMode(TreeNode* root) {
//使用前后指针进行记录大小,进行替换
count=0;
maxcount=0;
pre=NULL;
vec.clear();
searchBST(root);
return vec;
}
};
使用前后指针进行记录。
下面是迭代法
cpp
class Solution {
public:
vector<int> findMode(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL;
int maxCount = 0; // 最大频率
int count = 0; // 统计频率
vector<int> result;
while (cur != NULL || !st.empty()) {
if (cur != NULL) { // 指针来访问节点,访问到最底层
st.push(cur); // 将访问的节点放进栈
cur = cur->left; // 左
} else {
cur = st.top();
st.pop(); // 中
if (pre == NULL) { // 第一个节点
count = 1;
} else if (pre->val == cur->val) { // 与前一个节点数值相同
count++;
} else { // 与前一个节点数值不同
count = 1;
}
if (count == maxCount) { // 如果和最大值相同,放进result中
result.push_back(cur->val);
}
if (count > maxCount) { // 如果计数大于最大值频率
maxCount = count; // 更新最大频率
result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}
pre = cur;
cur = cur->right; // 右
}
}
return result;
}
};