/*
求出二叉树所有子树(包括根节点的树)的元素的和,然后求出出现
元素和次数最多的哪些
因为需要求子树,所以肯定是递归最为方便。
定义一个map,在遍历时记录子树的元素和,同时求出出现的最大次数,
然后对应map求出Key.因为需要求子树,所以肯定是递归最为方便。
*/
int max = 0;
public int[] findFrequentTreeSum(TreeNode root) {
if(root==null) return new int[0];
Map<Integer,Integer> map = new HashMap<>();
helper(root,map);
//然后求出map中value最大值对应的key
List<Integer> rs = new LinkedList<>();
for (Integer i:map.keySet()){
if(map.get(i)==max){
rs.add(i);
}
}
int[] resArr = new int[rs.size()];
for(int i = 0;i < rs.size();i++){
resArr[i] = rs.get(i);
}
return resArr;
}
//计算二叉树中每个根节点的子树和
private int helper(TreeNode root,Map<Integer,Integer> map){
if(root==null) return 0;
//求出当前节点为根的元素和
int left = helper(root.left,map);
int right = helper(root.right,map);
int val = left+right+root.val;
map.put(val,map.getOrDefault(val,0)+1);
max = Math.max(max,map.get(val));
return val;
}
LeetCode508 出现次数最多的子树元素和
最新推荐文章于 2020-04-23 19:29:47 发布