508. 出现次数最多的子树元素和
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<int, int> cnt;
int maxCnt = 0;
int dfs(TreeNode *node)
{
/// 如果当前节点为空,直接返回0
if (node == NULL)
return 0;
/// 否则求出当前的子树元素和
int sum = node->val + dfs(node->left) + dfs(node->right);
/// 更新这个子树元素和的出现次数,并且保存出现次数的最大值到maxCnt中
maxCnt = max(maxCnt, ++cnt[sum]);
/// 返回子树元素和
return sum;
}
vector<int> findFrequentTreeSum(TreeNode* root) {
/// 首先调用dfs,求出各个子树元素和和对应出现的次数
dfs(root);
vector<int> ret;
/// 遍历所有的<子树元素和, 子树元素和出现次数>键-值对
for (auto i : cnt)
{
/// 如果当前子树元素和的出现次数和最大次数相等,则将这个子树元素和添加到答案
if(i.second == maxCnt)
ret.push_back(i.first);
}
/// 返回
return ret;
}
};