一、题意
二、解答过程
在 《二叉树:搜索树的最小绝对值差》中我们用到了 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; } };