【LeetCode 42】501.二叉搜索树中的众数

文章目录

一、题意

【LeetCode 42】501.二叉搜索树中的众数_众数

二、解答过程

在 《二叉树:搜索树的最小绝对值差》​中我们用到了 ​​pre​​​指针和 ​​cur​​指针的技巧。这里又用上了。

弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。

而且初始化时pre==NULL,这样当pre为NULL时,我们就知道这是比较的第一个元素。

if (pre == NULL) { // 第一个节点
count = 1; // 频率为1
} else if (pre->val == cur->val) { // 与前一个节点数值相同
count++;
} else { // 与前一个节点数值不同
count = 1;
}
pre = cur; // 更新上一个节点

如何遍历一遍就能找到所有众数呢?

遍历一遍频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

if (count > maxCount) { // 如果计数大于最大值
maxCount = count; // 更新最大频率
result.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}

【LeetCode 42】501.二叉搜索树中的众数_结果集_02

class Solution {
public:
int maxCount;//最大频率
int count;//统计频率
TreeNode* pre;
vector<int>result;
void searchBST(TreeNode *cur)
{
if(cur==NULL) return;
searchBST(cur->left);//左

if(pre==NULL)//第一个结点
{
count=1;
}else if(pre->val==cur->val){//与前一个节点数值相同
count++;
} else{//与前一个节点数值不同
count=1;
}
pre=cur;//更新上一个节点

if(count==maxCount)//如果和最大值相同,放进result
{
result.push_back(cur->val);
}
if(count>maxCount)//如果计数大于最大值频率
{
maxCount=count;//更新最大频率
result.clear();//关键一步,不要忘记清空result,之前result里的元素都失效了
result.push_back(cur->val);
}

searchBST(cur->right);//右
return;
}

vector<int> findMode(TreeNode* root) {
count=0;
maxCount=0;
TreeNode* pre=NULL;//记录前一个节点
result.clear();

searchBST(root);
return result;

}
};