给定一棵二叉树,求出现次数最多的子树和。子树和:包含当前节点和其所有子节点的和。
分析:用递归的方法,把每个节点的子树和与出现的频率求出来存入HashMap中(和为key,频率为value),对HashMap中的所有数值对进行遍历,如果存在频率更高的,则清空list,并加入当前sum,如果频率一样就加入list。
public int[] findFrequentTreeSum(TreeNode root) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
sum(root, map);
Set<Integer> set = map.keySet();
Iterator it = set.iterator();
int max = 0;
List<Integer> list = new ArrayList<Integer>();
while(it.hasNext()){
int sum = (Integer)it.next();
int fre = map.get(sum);
if(fre== max)
list.add(sum);
else if(fre > max){
list.clear();
list.add(sum);
max = fre;
}
}
int[] result = new int[list.size()];
for(int i = 0; i < list.size(); i++){
result[i] = list.get(i);
}
return result;
}
public int sum(TreeNode root, HashMap<Integer, Integer> map){
if(root == null)
return 0;
int sum = root.val + sum(root.left, map) + sum(root.right, map);
if(map.containsKey(sum))
map.put(sum, map.get(sum) + 1);
else
map.put(sum, 1);
return sum;
}