给你一个二叉树的根结点,请你找出出现次数最多的子树元素和。一个结点的「子树元素和」定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。你需要返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
示例 1:
输入:
5
/ \
2 -3
返回 [2, -3, 4],所有的值均只出现一次,以任意顺序返回所有值。
示例 2:
输入:
5
/ \
2 -5
返回 [2],只有 2 出现两次,-5 只出现 1 次。
class Solution{
public:
int sum=0;
unordered_map<int,int>map;
void dfs(TreeNode*root){
if(root!=NULL){
visit(root);
map[sum]++;
sum=0;
dfs(root->left);
dfs(root->right);
}
}
void visit(TreeNode*root){
if(root!=NULL){
sum+=root->val;
visit(root->left);
visit(root->right);
}
}
static bool cmp(pair<int,int>a,pair<int,int>b){
return a.second<b.second;
}
vector<int>findFrequentTreeSum(TreeNode*root)
{
dfs(root);
vector<pair<int,int>>res;
vector<int>ans;
for(unordered_map<int,int>::iterator p=map.begin();p!=map.end();p++)
res.push_back(pair(p->first,p->second));
sort(res.begin(),res,end(),cmp);
if(res.size()==1)
ans.push_back(res[0].first);
if(res.size()==0)
return ans;
for(int i=0;i<res.size()-1;i++)
{
ans.push_back(res[i].first);
if(res[i+1].second!=res[i].second)
break;
if(i+1==res.size()-1)
ans.push_back(res[i+1].first);
}
return ans;
}
}