###### tags: `LeetCode` `Tree` `Recursion` `Medium` `DFS` # LeetCode #508 [Most Frequent Subtree Sum](https://leetcode.com/problems/most-frequent-subtree-sum/) ### (Medium) 給你一個二元樹的根結點,請你找出出現次數最多的子樹元素和。一個結點的「子樹元素和」定義為以該結點為根的二元樹上所有結點的元素之和(包括結點本身)。 你需要返回出現次數最多的子樹元素和。如果有多個元素出現的次數相同,返回所有出現次數最多的子樹元素和(不限順序)。 --- 使用unordered_map記數, DFS遍歷(需處理每個節點作為根節點的樹和, 以及該節點作為其父節點的左(右)子節點的合, 因此要將節點合放入unordered_map中, 同時回傳節點和)。並且同時記錄次數最多的和的次數(maxCount)。 全部DFS做完之後, 遍歷unordered_map, 將次數符合maxCount的key放入數組中, 最後回傳數組即可。 --- ``` class Solution { public: int maxCount=0; unordered_map<int,int> c; vector<int> findFrequentTreeSum(TreeNode* root) { dfs(root, c); vector<int> ans; for(auto& s:c){ if(s.second==maxCount)ans.push_back(s.first); } return ans; } int dfs(TreeNode* node, unordered_map<int,int>& c){ if(!node)return 0; int sum=node->val+dfs(node->left, c)+dfs(node->right, c); maxCount=max(++c[sum], maxCount); return sum; } }; ```