Leetcode 508. Most Frequent Subtree Sum

来源:互联网 发布:网络理财被骗怎么办 编辑:程序博客网 时间:2024/04/29 22:18

直接贴代码,本题用递归不超时
问题描述

Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a node is defined as the sum of all the node values formed by the subtree rooted at that node (including the node itself). So what is the most frequent subtree sum value? If there is a tie, return all the values with the highest frequency in any order.

 typedef pair<int, int> PAIR; int cmp(const PAIR &x, const PAIR &y) {     return x.second > y.second; } //拆成相同的子问题,递归统计子树和情况,然后排序取最值class Solution {public:    vector<int> findFrequentTreeSum(TreeNode *root) {        map<int, int> result;        calculateSubtree(result, root);        //对计算结果排序        vector<PAIR> pair_vec;        for (map<int, int>::iterator map_iter = result.begin(); map_iter != result.end(); ++map_iter)        {            pair_vec.push_back(make_pair(map_iter->first, map_iter->second));        }        sort(pair_vec.begin(), pair_vec.end(), cmp);        vector<int> mostFrequent;        //取最值        for (vector<PAIR>::iterator curr = pair_vec.begin(); curr != pair_vec.end(); ++curr)        {            if (curr == pair_vec.begin()) {                mostFrequent.push_back(curr->first);            }            else if (curr->second == (pair_vec.begin())->second) {                mostFrequent.push_back(curr->first);            }            else {                break;            }        }        return mostFrequent;    }    int calculateSubtree(map<int, int>& result, TreeNode* root) {        //子树为空,对结果0作用        if (root == NULL) return 0;        //叶子节点直接加入子树和        if (root->right == NULL && root->left == NULL) {            result[root->val]++;            return root->val;        }        int total = root->val + calculateSubtree(result, root->left) + calculateSubtree(result, root->right);        result[total]++;        return total;    }};
0 0
原创粉丝点击