Leetcode 508. 出現次數最多的子樹元素和
給出二叉樹的根,找出出現次數最多的子樹元素和。一個結點的子樹元素和定義爲以該結點爲根的二叉樹上所有結點的元素之和(包括結點本身)。然後求出出現次數最多的子樹元素和。如果有多個元素出現的次數相同,返回所有出現次數最多的元素(不限順序)。
示例 1
輸入:
5
/
2 -3
返回 [2, -3, 4],所有的值均只出現一次,以任意順序返回所有值。
示例 2
輸入:
5
/
2 -5
返回 [2],只有 2 出現兩次,-5 只出現 1 次。
提示: 假設任意子樹元素和均可以用 32 位有符號整數表示。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/most-frequent-subtree-sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
### 解題思路
後序遍歷
### 代碼
```cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
set<int> res_pre; //先用set存數防止重複
int max_count=-1;
map<int,int> m;
vector<int> findFrequentTreeSum(TreeNode* root) {
dfs(root);
vector<int> res;
res.assign(res_pre.begin(), res_pre.end()); //set中的值放到 vector中再返回,assign的方式記下來
return res;
}
int dfs(TreeNode* root){ //後序遍歷
if(root==NULL) return 0;
int l=dfs(root->left);
int r=dfs(root->right);
int sum=r+l+root->val; //此節點子樹和
if(m.count(sum)) m[sum]++; //在map中存下來出現次數
else m[sum]=1;
if(max_count<m[sum]){ //最大次數變化,清空set,重新存入
max_count=m[sum];
res_pre.clear();
res_pre.insert(sum);
}else if(max_count==m[sum]){ //達到目前最大次數,存入
res_pre.insert(sum);
}
return sum;
}
};