1、自己写的 感觉代码好臃肿~~~
递归得到每个节点的Subtree Sum,存放到list中。
在对list进行处理时,先用map存list中出现的值以及出现次数,最后遍历map的value得到出现次数最多的值。
List<Integer> list = new ArrayList<>();//存放每一个节点的SubtreeSum
public int[] findFrequentTreeSum(TreeNode root) {
if(root == null) return new int[0];
findChildrenSum(root);
Map<Integer,Integer> map = new HashMap<>();//key list中的数字,value list中数字出现的次数
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
int curr = it.next();
if (map.containsKey(curr)){
map.put(curr, map.get(curr)+1);
}else {
map.put(curr, 1);
}
}
Collection<Integer> count = map.values();//map中value最大的值 即list中数字出现的最大次数
int maxCount = Collections.max(count);
list.clear();//list没用了 用来存出现次数最多的数
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue() == maxCount) {
list.add(entry.getKey());//得到对应的map
}
}
int[] sum = new int[list.size()];
int i = 0;
for(int num : list) {
sum[i] = num;
i++;
}
return sum;
}
public int findChildrenSum(TreeNode root) {
if(root == null) return 0;
int tmp = root.val + findChildrenSum(root.left) + findChildrenSum(root.right);
list.add(tmp);
return tmp;
}