本题属于简单题,只需要中序遍历两次分别找出最大频率、将最大频率的数加入结果集即可(二叉搜索树的中序遍历是有序的)。但若要使用一次遍历就得到答案,就必须设计一系列辅助变量和策略。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> findMode(TreeNode* root) {
inorder(root);
return res;
}
TreeNode* pre = NULL; // 使用一个辅助指针,记录当前结点的前驱,这样当前结点的值才能和前一个结点比较
vector<int> res;
int count = 0;
int maxCount = 0;
void inorder(TreeNode* cur) {
if(cur == NULL)
return;
inorder(cur->left);
if(pre == NULL) { // 中序的第一个结点
count = 1;
} else if(cur->val == pre->val) { // 与前一个结点值相同是count++
count ++;
} else { // cur->val != pre->val,与前一个结点值不同时复原count
count = 1;
}
pre = cur; // 更新前驱
if(count == maxCount) // 当前个数和最大个数相等时,先将该数加入结果集
res.push_back(cur->val);
if(count > maxCount) { // 当前个数大于最大个数时
maxCount = count; // 当前val的数目就是新的maxCount,要更新maxCount的值
res.clear(); // 同时须清空结果集(因为结果集之前的内容都是按老maxCount得出的)
res.push_back(cur->val); // 再将val压入清空后的结果集
}
inorder(cur->right);
}
};