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; }