题目描述
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2]
,
1 \ 2 / 2
返回[2]
.
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
解题思路
使用额外空间
class Solution {
public:
unordered_map<int,int> mp;
int maxnum = 0;
void inOrder(TreeNode* root){
if(root == NULL) return;
mp[root->val]++;
maxnum = max(maxnum,mp[root->val]);
inOrder(root->left);
inOrder(root->right);
}
vector<int> findMode(TreeNode* root) {
vector<int> ans;
inOrder(root);
for(auto it = mp.begin();it!=mp.end();it++){
if(it->second == maxnum) ans.push_back(it->first);
}
return ans;
}
};
不使用额外空间
class Solution {
public:
vector<int> ans;
void inOrder(TreeNode* root,TreeNode* &pre,int& curtime,int& maxtime){
if(root == NULL) return;
inOrder(root->left,pre,curtime,maxtime);
if(pre != NULL) curtime = (pre->val == root->val)?curtime+1:1;
if(curtime == maxtime) ans.push_back(root->val);
if(curtime>maxtime){
ans.clear();
ans.push_back(root->val);
maxtime = curtime;
}
pre = root;
inOrder(root->right,pre,curtime,maxtime);
}
vector<int> findMode(TreeNode* root) {
TreeNode* pre = NULL;
int curtime = 1,maxtime = 0;
inOrder(root,pre,curtime,maxtime);
return ans;
}
};