508. 出现次数最多的子树元素和
508. 出现次数最多的子树元素和
给你一个二叉树的根结点 root
,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
提示:
- 节点数在
[1, 104]
范围内 -105 <= Node.val <= 105
思路:
本题涉及计算子树元素和,自然利用后序遍历自底向上计算最为快捷,利用哈希表以及一个计数量最后取出出现次数最多的元素即可。
class Solution {
public:
vector<int> res;
unordered_map<int,int>mp;//利用哈希表记录子树元素和与出现次数
int maxCount=0;//记录最大出现次数
vector<int> findFrequentTreeSum(TreeNode* root) {
traver(root);
for(auto a:mp){
if(a.second==maxCount){
res.push_back(a.first);
}
}
return res;
}
//返回子树元素和 二叉树遍历
int traver(TreeNode* root){
if(root==nullptr)return 0;
int rootLeft=traver(root->left);
int rootRight=traver(root->right);
//后序遍历
int rootSum=root->val+rootLeft+rootRight;
if(mp.count(rootSum)){
mp.at(rootSum)++;
}else{
mp.emplace(rootSum,1);
}
//更新最大次数
maxCount=(maxCount>mp.at(rootSum))?maxCount:mp.at(rootSum);
return rootSum;
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16155087.html