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


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

题目描述

本题目来自LeetCode上的『508. 出现次数最多的子树元素和』

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

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

示例1:

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

提示
  • 节点数在 [1, 104] 范围内
  • -10^5 <= Node.val <= 10^5

题解

题意就是让我们求出树中每个子树的和,然后返回出现次数最多的和。
深搜求每个子树和,使用一个哈希表记录每个子树和出现的次数,遍历哈希表找到次数最大的几个子树和。

代码

class Solution {
private:
    unordered_map<int, int> mp;
    int dfs(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
        int ret = root->val;
        ret += dfs(root->left) + dfs(root->right);
        ++mp[ret];
        return ret;
    }
public:
    vector<int> findFrequentTreeSum(TreeNode* root) {
        vector<int> ans;
        dfs(root);
        int maxCnt = 0;
        for (const auto& [_, cnt]: mp) {
            maxCnt = max(cnt, maxCnt);
        }
        for (const auto& [sum, cnt]: mp) {
            if (cnt == maxCnt) {
                ans.emplace_back(sum);
            }
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:$O(n)$,$n$ 为结点个数。
  • 空间复杂度:$O(n)$。

文章作者: xitie2000
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xitie2000 !
评论
  目录