2023.7.10
这道题我的思路是适用于任意二叉树的思路:
- 先用任意一个遍历方法将节点保存至map<int,int>中,key为节点值,value为频率。
- 由于map没有对value(频率)排序的方法,所以将map的键值对转移至vector<pair<int,int>>中,再利用sort方法以及自定义一个cmp函数 来自定义排序方法。
- 由于众数可能不止一个,在得到一个从小到大(频率)的数组之后,将第一个值v[0]丢入最终数组ans中,再遍历剩下的元素,若频率等于第一个值的频率,则也将其丢入ans中。
下面看下代码细节:
class Solution {
public:
bool static cmp (const pair<int, int>& a, const pair<int, int>& b)
//bool static cmp(pair<int,int>a,pair<int,int>b)
{
return a.second > b.second;
}
vector<int> findMode(TreeNode* root) {
//遍历所有节点,并将其值以及出现频率丢入map中。
unordered_map<int,int> map;
stack<TreeNode*> stk;
while(!stk.empty() || root)
{
while(root)
{
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
map[root->val]++;
root = root->right;
}
//将map的对组丢入vector中
vector<pair<int,int>> v(map.begin(),map.end());
vector<int> ans;
//自定义排序
sort(v.begin(),v.end(),cmp);
//取出频率最大的节点值
ans.push_back(v[0].first);
//取出剩下可能频率最大的节点值
for(int i=1; i<v.size(); i++)
{
if(v[i].second == v[0].second) ans.push_back(v[i].first);
}
return ans;
}
};
这里解释一下cmp函数的几个关键字:
- static:在C++中,
static
成员函数属于类本身,而不是类的实例。cmp
函数被声明为bool static cmp
,意味着它是一个静态成员函数。这意味着可以直接通过类名和作用域解析运算符来调用该函数,而不需要创建类的实例。 - const:
const
修饰函数参数表示该参数是只读的,即函数内部不会修改该参数的值。在cmp
函数中,const pair<int, int>& a
和const pair<int, int>& b
表示传入的参数a
和b
是只读的,函数内部不会修改它们的值。