本题是二叉搜索树的重要做题思路:
(1)因为二叉搜索树是有序的,根据中序遍历就是有序数组,所以比较相邻元素的值,频率出现最高的作为输出;
(2)用两个指针分别指向前一个节点和当前节点,比较两者的值,若相等则当前频率加一,若不等则恢复当前频率为1,重新比较下一个值;
(3)分别记录最大频率和当前频率,若当前频率等于最大频率,将当前值加入结果数组,若当前频率小于最大频率,则更新最大频率,清空结果数组,再将当前值加入结果数组;
代码如下:
class Solution {
private:
int maxCount = 0; // 最大频率
int count = 0; // 统计频率
TreeNode* pre = NULL;
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 ;
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
pre = NULL; // 记录前一个节点
result.clear();
searchBST(root);
return result;
}
};