给你一个二叉树的根结点
root
,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」
定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例:
输入: root = [5,2,-3]
输出: [2,-3,4]
思路:
DFS + 哈希表:
我们每次判断
1 2 3
| unordered_map<int,int> mp; sum = root->val + leftSum + rightSum; maxCnt = max(maxCnt, ++mp[sum]);
|
时间复杂度为:O(n)
空间复杂度为:O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: int maxCnt = 0; unordered_map<int,int> mp; vector<int> findFrequentTreeSum(TreeNode* root) { dfs(root); vector<int> res; for(auto &[s, c] : mp){ if(c == maxCnt){ res.push_back(s); } } return res; } int dfs(TreeNode *root){ if(root == nullptr){ return 0; } int sum = root->val + dfs(root->left) + dfs(root->right); maxCnt = max(maxCnt, ++mp[sum]); return sum; } };
|