原题链接:501. 二叉搜索树中的众数
思路:
二叉搜索树,必然是有序的。
遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。
弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组)
频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。
全代码:
class Solution {
public:
int maxCount = 0; // 最大频率
int count = 0; // 统计频率
TreeNode* pre = NULL;
void rev(TreeNode* Node, vector<int>& vec)
{//中序获得树的所有值
//左
if (Node->left) rev(Node->left, vec);
//中
if(pre == NULL)
{//第一个结点
count = 1;
}else if(pre ->val == Node ->val)
{//与前一个结点值相同
count++;
}else
{//与前一个结点值不同
count = 1;
}
pre = Node;//更新上一个结点
if(count == maxCount)
{//如果最大值相同,放进vec容器中
vec.push_back(Node ->val);
}
if(count > maxCount)
{//如果计数器大于最大值频率,清空容器,让容器内的元素失效,再把计数器(最大值)push进容器内
maxCount = count;
vec.clear();
vec.push_back(Node ->val);
}
//右
if (Node->right) rev(Node->right, vec);
}
vector<int> findMode(TreeNode* root) {
vector<int> vec;
int count = 0,maxVlaue = 0;
if(root == NULL) return vec;
rev(root,vec);
return vec;
}
};