问题描述
给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。
示例 1
输入:
5
/ \
2 -3
返回 [2, -3, 4],所有的值均只出现一次,以任意顺序返回所有值。
示例 2
输入:
5
/ \
2 -5
返回 [2],只有 2 出现两次,-5 只出现 1 次。
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.lang.Math;
class Solution {
public List<Integer> solution(TreeNode node) {
if(null == node){
return 0;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
sum(node, map);
int maxCount = 0;
for(Integer val : map.keySet()){
maxCount = Math.max(maxCount, map.get(val));
}
List<Integer> result = new ArrayList<Integer>();
for(Integer val : map.keySet()){
if(map.get(val) == maxCount){
result.add(val);
}
}
return result;
}
private int sum(TreeNode node, HashMap<Integer, Integer> map){
if(null == node){
return 0;
}
int leftSum = sum(node.left, map);
int rightSum = sum(node.right, map);
int val = leftSum + rightSum + node.val;
int count = map.getOrDefault(val, 0);
map.put(val, ++count);
}
}