给定具有重复项的二叉搜索树(BST),找到给定BST中的所有modes(最频繁出现的元素)。
在这里假设一个BST定义如下:
节点的左子树仅包含键小于或等于父节点的节点。
节点的右子树仅包含键大于或等于父节点的节点。
左右子树也必须是二叉搜索树。
样例
样例1:
输入:
{1,#,2,2}
输出:
[2]
解释:
1
\
2
/
2
样例2:
输入:
{-2,-2,-2}
输出:
[-2]
解释:
-2
/ \
-2 -2
注意事项
如果树有多个modes,您可以按任何顺序返回它们。
输入测试数据 (每行一个参数)如何理解测试数据?
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a root of integer
* @return: return a integer list
*/
unordered_map<int, int> mymap;
vector<int> findMode(TreeNode * root) {
// write your code here
vector<int> ret;
bianli(root);
vector<pair<int, int>> vtMap;
for (auto it = mymap.begin(); it != mymap.end(); it++)
vtMap.push_back(make_pair(it->first, it->second));
sort(vtMap.begin(), vtMap.end(),
[](const pair<int, int> &x, const pair<int, int> &y) -> int {
return x.second > y.second;
});
for (auto it = vtMap.begin(); it != vtMap.end(); it++)
{
if(it->second == vtMap.begin()->second)
{
ret.push_back(it->first);
}
}
return ret;
}
void bianli(TreeNode * root)
{
if(root != NULL)
{
mymap[root->val]++;
bianli(root->left);
bianli(root->right);
}
}
};