【LeetCode 42】501.二叉搜索树中的众数
原创
©著作权归作者所有:来自51CTO博客作者codelinghu的原创作品,请联系作者获取转载授权,否则将追究法律责任
【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);
}
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;
}
};