给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
示例 2:
输入:root = [0] 输出:[0]
提示:
- 树中节点的数目在范围
[1, 104]
内 -105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
采用双指针策略
class Solution {
private:
int count = 0;
int maxCount = 0;
TreeNode *pre = NULL;
vector<int> result;
void searchBST(TreeNode *cur) {
if (cur == nullptr) return;
// 左
searchBST(cur->left);
// 中
if (pre == nullptr) {
count = 1;
} else if (pre->val == cur->val) {
count++;
} else { // 与前一个节点数值不同
count = 1;
}
//让pre为cur的前一个指针
pre = cur;
//此时为最大众数
if (count == maxCount) {
//则放入当前结点
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) {
//先清空数组避免有冗余数据
result.clear();
searchBST(root);
return result;
}
};