题干:
代码:
class Solution {
public:
unordered_map<int,int>map;
void traversal(TreeNode* root){
if(root == NULL)return;
traversal(root->left);
map[root->val]++;
traversal(root->right);
}
bool static cmp(const pair<int,int>& a, const pair<int,int>& b){
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
traversal(root);
vector<pair<int,int>>tmp(map.begin(),map.end());
sort(tmp.begin(),tmp.end(),cmp);
vector<int>res;
for(int i = 0; i < tmp.size(); i++){
if(tmp[i].second == tmp[0].second)res.push_back(tmp[i].first);
}
return res;
}
};
整体思路就是创建额外空间将二叉树中的节点值和出现次数储存起来,考虑到可以作为键值对存储所以创建unordered_map。存入<int,int>类型数据。
map的存储类型是<int,int>,而转存的对象tmp的存储类型是<pair<int,int>>。
由于map无序且无法排序,所以需要将其转入vector容器利用sort函数进行排序。
以下摘自liuxiaocs7对sort函数的解释:
Sort函数有三个参数:(第三个参数可不写)
第一个是要排序的数组的起始地址。
第二个是结束地址(最后一位要排序的地址),这两者都是地址
第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
不创建额外空间,利用双指针:
class Solution {
public:
TreeNode* pre = NULL;
int count, maxcount;
vector<int>res;
void traversal(TreeNode* cur){
if(cur == NULL)return;
traversal(cur->left);
if(pre == NULL)count = 1;
else if(pre->val == cur-> val)count++;
else count = 1;
if(count == maxcount)res.push_back(cur->val);
else if(count > maxcount){
res.clear();
maxcount = count;
res.push_back(cur->val);
}
pre = cur;
traversal(cur->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return res;
}
};