给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
找到数组中的众数有两种方法:
- 1 以空间换时间,使用map记录众数
- 2 以时间换空间,先对数组进行排序,然后记录众数
由于二叉树的中序遍历天然有序,此处我们使用时间换空间的方法。
经典步骤:
- 1 先处理n-1个节点
- 2 处理最后一个节点(当数组的众数都是1时,最后一个节点也是众数)
代码如下:
class Solution {
public:
vector path;
void traversal(TreeNode* root){
if (root==nullptr) return ;
traversal(root->left);
path.push_back(root->val);
traversal(root->right);
}
vector findMode(TreeNode* root) {
if (root==nullptr) return vector();
// 1 中序遍历找到递增序列
traversal(root);
// 2 找众数
vector result;
int curCount = 1;
int maxCount = 1;
// 2.1 处理前面n-1个元素
for(int i=0; i<path.size()-1; i++){ if (path[i] == path[i+1]) curCount++; else curCount = 1; if (curCount > maxCount){
result.clear();
maxCount = curCount;
result.push_back(path[i]);
}
else if (curCount == maxCount) result.push_back(path[i]);
}
// 2.2 处理最后一个元素
if (maxCount == 1) result.push_back(path[path.size()-1]);
return result;
}
};