Leetcode508 Most Frequent Subtree Sum
Posted chason95
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode508 Most Frequent Subtree Sum相关的知识,希望对你有一定的参考价值。
研究题意发现,每个结点对应一个Subtree Sum,于是问题就变成了,先traverse一遍,找到每个subtree的sum,之后递归求出subtree的parent结点对应的subtree的sum,可能修改为栈会更快一点?没仔细思考,以后有时间再回来看吧。
public int[] findFrequentTreeSum(TreeNode root) { Set<Integer> ans = new HashSet<>(); HashMap<Integer,Integer> sums = new HashMap<>(); getNodeSum(root,sums); Set<Map.Entry<Integer,Integer>> set = sums.entrySet(); int maxnum = 0; for(Map.Entry<Integer,Integer> e:set) { if(e.getValue()>maxnum) { maxnum=e.getValue(); ans.clear(); ans.add(e.getKey()); } else if(e.getValue()==maxnum) { ans.add(e.getKey()); } } int[] result = new int[ans.size()]; int i=0; for(int a:ans) { result[i++]=a; } return result; } public static int getNodeSum(TreeNode T,HashMap<Integer,Integer> sums){ //需要先对T进行判断,这点很重要,不然会报错NullPointerException if(T==null) return 0; int leftChildSum = T.left!=null?getNodeSum(T.left,sums):0; int rightChildSum = T.right!=null?getNodeSum(T.right,sums):0; int tempsum = T.val+leftChildSum+rightChildSum; if(sums.containsKey(tempsum)) sums.put(tempsum, sums.get(tempsum)+1); else sums.put(tempsum, 1); return tempsum; }
以上是关于Leetcode508 Most Frequent Subtree Sum的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 508. Most Frequent Subtree Sum
Leetcode508 Most Frequent Subtree Sum
[leetcode]508. Most Frequent Subtree Sum二叉树中出现最多的值
508. Most Frequent Subtree Sum