题目思路还是一如往常,唯一要考虑的就是怎么存储每个子树的SubTreeSum和频率, 来方便找频率最高的那些subTreeSum。
因为每个SubTreeSum和频率是一一对应的,所以map是个好办法。
map的key存储subTreeSum, val存储频率。
从树底部开始计算每个subTree的sum, 这样就得走一遍每个节点。
遍历完所有的节点得到map后,就进行再加工。
遍历map里的每个元素,然后检查每个元素的frequency数值。
1) frequency如果和max_frequency一样,那就把这个frequency对应的subTreeSum数值push到要输出的队列里。
2)frequency比max_frequency 大,那就说明之前找到不是最终结果。清空结果队列,重新push frequency对应的sumTreeSum。然后更新max_frequency数值。
代码如下
/**
* 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:
//key: sum val: account
unordered_map<int, int> mymap;
int help(TreeNode* root)
{
if(root == nullptr)
return 0;
int subTreeSum =0;
subTreeSum = root->val + help(root->left) + help(root->right);
if(mymap.find(subTreeSum) != mymap.end())
mymap[subTreeSum]++;
else
mymap[subTreeSum] = 1;
return subTreeSum;
}
vector<int> findFrequentTreeSum(TreeNode* root) {
if(root == nullptr)
return {};
vector<int> ret;
help(root);
int mostFrquentTimes = INT_MIN;
for(auto &it: mymap) {
if(it.second > mostFrquentTimes) {
mostFrquentTimes = it.second;
ret.clear();
ret.push_back(it.first);
}
else if(it.second == mostFrquentTimes)
ret.push_back(it.first);
}
return ret;
}
};
这个办法应该不是最优的解法,因为submit后速度并不理想。