508 出現次數最多的子樹元素和
阿新 • • 發佈:2020-12-16
技術標籤:LeetCode
題目描述:
給你一個二叉樹的根結點,請你找出出現次數最多的子樹元素和。一個結點的「子樹元素和」定義為以該結點為根的二叉樹上所有結點的元素之和(包括結點本身)。
你需要返回出現次數最多的子樹元素和。如果有多個元素出現的次數相同,返回所有出現次數最多的子樹元素和(不限順序)。
示例 1:
輸入:
返回 [2, -3, 4],所有的值均只出現一次,以任意順序返回所有值。
示例 2:
輸入:
返回 [2],只有 2 出現兩次,-5 只出現 1 次。
提示: 假設任意子樹元素和均可以用 32 位有符號整數表示。
方法1:
主要思路:解題彙總連結
(1)使用後序遍歷+雜湊統計;
(3)並在遍歷的過程中,統計出各個和的出現頻次;
/**
* 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:
//後序遍歷
int back_order(TreeNode*root,unordered_map<int,int>&mp){
if(root==NULL){//終止條件
return 0;
}
//分別求出左右子樹之和
int left_sum=back_order(root->left,mp);
int right_sum=back_order(root->right,mp);
++mp[left_sum+right_sum+root->val];//再加上當前結點的值,就是當前子樹的和
return left_sum+right_sum+root->val;//返回當前子樹的和
}
vector<int> findFrequentTreeSum(TreeNode* root) {
//處理特殊的情形
if(root==NULL){
return{};
}
if(root->left==NULL&&root->right==NULL){
return {root->val};
}
int max_freq=0;//統計最大頻率
unordered_map<int,int> mp;//統計各個和的頻率
back_order(root,mp);//後續遍歷
for(auto&it:mp){//找出最大頻率
max_freq=max_freq<it.second?it.second:max_freq;
}
vector<int>res;//儲存結果
for(auto&it:mp){//儲存最大頻率對應的數字
if(it.second==max_freq){
res.push_back(it.first);
}
}
return res;
}
};