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 @   BailanZ  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示