Files
CSCI-1200/leetcode/p508_most_frequent_subtree_sum.cpp
2023-11-04 22:55:39 -04:00

57 lines
1.7 KiB
C++

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// get the subtree sum, update map1, and also update the maxFreq
int helper(TreeNode* node, std::unordered_map<int, int>& map1, int& maxFreq){
int sum;
int freq;
// base case
if(node==nullptr){
return 0;
}else if(node->left==nullptr && node->right==nullptr){
freq = (++map1[node->val]);
if(freq>maxFreq){
maxFreq = freq;
}
return node->val;
}
// general case
sum = node->val + helper(node->left, map1, maxFreq) + helper(node->right, map1, maxFreq);
freq = (++map1[sum]);
if(freq>maxFreq){
maxFreq = freq;
}
return sum;
}
vector<int> findFrequentTreeSum(TreeNode* root) {
int sum = 0;
int maxFreq = 0;
vector<int> result;
// sum and frequency
std::unordered_map<int, int> map1;
// find the tree sum of each subtree
if(root!=nullptr){
sum = helper(root, map1, maxFreq);
}
std::unordered_map<int, int>::iterator itr1 = map1.begin();
while(itr1!=map1.end()){
if(itr1->second == maxFreq){
result.push_back(itr1->first);
}
itr1++;
}
return result;
}
};