From f80c0a5a4a54033db548632ba809e0a277c0c889 Mon Sep 17 00:00:00 2001 From: Jidong Xiao Date: Sat, 4 Nov 2023 22:55:39 -0400 Subject: [PATCH] adding one problem using both unordered map and tree --- leetcode/p508_most_frequent_subtree_sum.cpp | 56 +++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 leetcode/p508_most_frequent_subtree_sum.cpp diff --git a/leetcode/p508_most_frequent_subtree_sum.cpp b/leetcode/p508_most_frequent_subtree_sum.cpp new file mode 100644 index 0000000..46496f3 --- /dev/null +++ b/leetcode/p508_most_frequent_subtree_sum.cpp @@ -0,0 +1,56 @@ +/** + * 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& 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 findFrequentTreeSum(TreeNode* root) { + int sum = 0; + int maxFreq = 0; + vector result; + // sum and frequency + std::unordered_map map1; + // find the tree sum of each subtree + if(root!=nullptr){ + sum = helper(root, map1, maxFreq); + } + std::unordered_map::iterator itr1 = map1.begin(); + while(itr1!=map1.end()){ + if(itr1->second == maxFreq){ + result.push_back(itr1->first); + } + itr1++; + } + return result; + } +};