508. 出现次数最多的子树元素和

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/most-frequent-subtree-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
难点在于取频率最高的,一开始是把所有的都放入map中,key:sum和,value:频率;map填充完毕后,找最大频率的,取出数据。
其实可以在填充时就做判断。map只是一个填充工具,如果频率>最大值。重置结果集,更新最大值;等于最大值时,添加到集合。
/**
子树和:刚开始看题,没看懂;大概意思是以树中的每个节点为根节点,组成的子树和,取出现频率最多的,
子树和,就要从底向上遍历了。
*/
Map<Integer,Integer> map = new HashMap<>();
List<Integer> ans = new ArrayList<>();
int maxFrequ=0;
public int[] findFrequentTreeSum(TreeNode root) {
if(root == null) {
return new int[0];
}
dfs(root);
int[] ret = new int[ans.size()];
for(int i=0;i<ans.size();i++) {
ret[i] = ans.get(i);
}
return ret;
}
public int dfs(TreeNode node) {
if(node == null) {
return 0;
}
int sum = node.val + dfs(node.left) + dfs(node.right);
// 和的频率加一
map.put(sum, map.getOrDefault(sum,0)+1);
// 如果最大的频率小于现有的了,跟新最大的频率,之后把结果集合清空
if(maxFrequ < map.get(sum)) {
maxFrequ = map.get(sum);
ans.clear();
}
// 如果已经是最大频率了,就加入到结果集合中
if(maxFrequ == map.get(sum)) {
ans.add(sum);
}
return sum;
}
浙公网安备 33010602011771号