开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
501:二叉搜索树中的众数
class Solution {
private:
int maxcount;//最大频率
int count;//统计频率
TreeNode* pre;//记录前一个节点的指针
vector<int> result;//储存结果
void searchBST(TreeNode* cur)
{
if(cur == NULL) return; //如果cur为空,就直接返回
searchBST(cur->left);
if(pre == NULL) //当前访问的节点是第一个节点,count为1
{
count = 1;
}
else if(pre->val == cur->val)//当前节点的值与前一个节点值相同,count++
{
count++;
}
else //与前一个节点值不同,重新将count置1,必须要重新置为1
{
count = 1;
}
pre = cur; //更新上一个节点
if(count == maxcount) //如果和最大值相同,放进result中
{
result.push_back(cur->val);
}
if(count > maxcount) //如果计数大于最大值频率
{
maxcount = count; //更新最大频率
result.clear(); //清空result中的之前元素
result.push_back(cur->val);
}
searchBST(cur->right);
return;
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxcount = 0;
TreeNode* pre = NULL; //记录前一个节点
result.clear();
searchBST(root);
return result;
}
};
需要弄一个指针指向前一个节点,这样每次 cur(当前节点)才能和 pre(前一个节点)作比较。
而且初始化的时候 pre = NULL,这样当 pre 为 NULL 时候,我们就知道这是比较的第一个元素,然后再给 pre 赋值即 pre = cur;
频率 count 等于 maxCount,当然要把这个元素加入到结果集中
频率 count 大于 maxCount 的时候,不仅要更新 maxCount,而且要清空结果集(以下代码为 result 数组),因为结果集之前的元素都失效了
非递归:
class Solution {
public:
vector<int> findMode(TreeNode* root) {
vector<int> v;
if(root == nullptr) return v;
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = nullptr;
int count = 0;
int maxCount =0;
while(!st.empty() || cur!=nullptr)
{
//先将所有左节点入栈
while(cur)
{
st.push(cur);
cur = cur->left;
}
//处理
TreeNode* top = st.top();
st.pop();
//处理
if(pre == nullptr)
count = 1;
else if(pre->val == top->val)
count++;
else
count = 1;
if(count > maxCount)
{
v.clear();
v.push_back(top->val);
maxCount = count;
}
else if(count == maxCount)
{
v.push_back(top->val);
}
pre = top;
//去栈顶节点的右树访问
cur = top->right;
}
return v;
}
};