本题属于简单题,只需要中序遍历两次分别找出最大频率、将最大频率的数加入结果集即可(二叉搜索树的中序遍历是有序的)。但若要使用一次遍历就得到答案,就必须设计一系列辅助变量和策略。
/** * 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); } };