共计 1281 个字符,预计需要花费 4 分钟才能阅读完成。
题目要求
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.
Examples 1
Input:
5
/ \
2 -3
return [2, -3, 4], since all the values happen only once, return all of them in any order.
Examples 2
Input:
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.
现在有一棵树,要求计算每一个节点和该节点下所有自节点的值的和,并且找出出现次数最多的子树和。如果出现多个节点均出现最多次,则将这些节点都返回。
思路和代码
这题的核心思路在于利用后序遍历,先递归的计算出左子树和右子树的子树和,再将计算出当前的节点的子树和,并递归的统计每个子树和出现的次数,以及最大的子树和值。最后遍历所有统计,将统计结果等于最大子树和的子树和取出并返回。
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;
}