508. 出现次数最多的子树元素和

508. 出现次数最多的子树元素和

给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。

一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。

示例 1:

img

输入: root = [5,2,-3]
输出: [2,-3,4]

示例 2:

img

输入: 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;
    }
};
posted @ 2022-04-17 10:04  BailanZ  阅读(24)  评论(0编辑  收藏  举报