508. 出现次数最多的子树元素和

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/most-frequent-subtree-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


难点在于取频率最高的,一开始是把所有的都放入map中,key:sum和,value:频率;map填充完毕后,找最大频率的,取出数据。
其实可以在填充时就做判断。map只是一个填充工具,如果频率>最大值。重置结果集,更新最大值;等于最大值时,添加到集合。

 /**
    子树和:刚开始看题,没看懂;大概意思是以树中的每个节点为根节点,组成的子树和,取出现频率最多的,
    子树和,就要从底向上遍历了。
    
     */

     Map<Integer,Integer> map = new HashMap<>();
     List<Integer> ans = new ArrayList<>();
     int maxFrequ=0;
    public int[] findFrequentTreeSum(TreeNode root) {
        if(root == null) {
            return new int[0];
        }

        dfs(root);
        int[] ret = new int[ans.size()];
        for(int i=0;i<ans.size();i++) {
            ret[i] = ans.get(i);
        }
        return ret;

    }

    public int dfs(TreeNode node) {
        if(node == null) {
            return 0;
        }

        int sum  = node.val + dfs(node.left) + dfs(node.right);
        // 和的频率加一
        map.put(sum, map.getOrDefault(sum,0)+1);

        // 如果最大的频率小于现有的了,跟新最大的频率,之后把结果集合清空
        if(maxFrequ < map.get(sum)) {
            maxFrequ = map.get(sum);
            ans.clear();
        }
        // 如果已经是最大频率了,就加入到结果集合中
        if(maxFrequ == map.get(sum)) {
            ans.add(sum);
        }
        return sum;
    }

posted @ 2022-02-24 14:34  一颗青菜  阅读(7)  评论(0)    收藏  举报