leetcode508. Most Frequent Subtree Sum

題目要求

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.java

Examples 1
Input:node

5
 /  \
2   -3

return [2, -3, 4], since all the values happen only once, return all of them in any order.app

Examples 2
Input:code

5
 /  \
2   -5

return [2], since 2 happens twice, however -5 only occur once.
Note: You may assume the sum of values in any subtree is in the range of 32-bit signed integer.orm

如今有一棵樹,要求計算每個節點和該節點下全部自節點的值的和,而且找出出現次數最多的子樹和。若是出現多個節點均出現最屢次,則將這些節點都返回。遞歸

思路和代碼

這題的核心思路在於利用後序遍歷,先遞歸的計算出左子樹和右子樹的子樹和,再將計算出當前的節點的子樹和,並遞歸的統計每一個子樹和出現的次數,以及最大的子樹和值。最後遍歷全部統計,將統計結果等於最大子樹和的子樹和取出並返回。get

private int maxCount;
    Map<Integer, Integer> count = new HashMap<>();
    public int[] findFrequentTreeSum(TreeNode root) {
        calculateTreeSum(root);
        List<Integer> result = new ArrayList<>();
        for (Integer key : count.keySet()) {
            Integer value = count.get(key);
            if (value == maxCount) {
                result.add(key);
            }
        }
        return result.stream().mapToInt(Integer::intValue).toArray();
    }

    public int calculateTreeSum(TreeNode sum) {
        if (sum == null) return 0;
        int left = calculateTreeSum(sum.left);
        int right = calculateTreeSum(sum.right);
        int mid = left + right + sum.val;
        count.merge(mid, 1, Integer::sum);
        maxCount = Math.max(maxCount, count.get(mid));
        return mid;
    }
相關文章
相關標籤/搜索