力扣今日题508. 出现次数最多的子树元素和

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

一开始拿到题后,我看了不下5遍,老是想不通题干的出现次数最多的子树元素和多个元素出现的次数相同的意思,一会子树元素和,一会多个元素的,差点把我搞晕了。经过我的分析,题干把多个元素出现的次数换成字数元素和出现的次数可能会好理解一些。

class Solution {
    // sum -> count
    HashMap<Integer, Integer> sumToCount = new HashMap<>();

    public int[] findFrequentTreeSum(TreeNode root) {
        // 遍历二叉树,记录所有子树和及出现频率
        sum(root);
        // 找到最大的出现频率
        int maxCount = 0;
        for (int count : sumToCount.values()) {
            maxCount = Math.max(maxCount, count);
        }
        // 找到最大出现频率对应的的子树和
        ArrayList<Integer> res = new ArrayList<>();
        for (Integer key : sumToCount.keySet()) {
            if (sumToCount.get(key) == maxCount) {
                res.add(key);
            }
        }
        // 转化为 Java 数组
        int[] arr = new int[res.size()];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = res.get(i);
        }
        return arr;
    }

    // 定义:输入一个节点,返回以该节点为根的二叉树所有节点之和
    int sum(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftSum = sum(root.left);
        int rightSum = sum(root.right);
        int res = root.val + leftSum + rightSum;

        // 后序遍历位置,顺手记录子树和对应的频率,如果有和res就加1,否则就不加。
        sumToCount.put(res, sumToCount.getOrDefault(res, 0) + 1);
        return res;
    }
}
class Solution {
    //sum ->count ,设置一个 保存子元素和(int),出现次数(int ) 的变量sumtoCount
    HashMap<Integer,Integer> sumtoCount = new HashMap<>();

    public int[] findFrequentTreeSum(TreeNode root) {
        //遍历二叉树,记录所有子树和出现的频率
        sum(root);
        //找到最大的出现频率
        int maxCount = 0;
        for(int count: sumtoCount.values()){
            maxCount = Math.max(maxCount,count);
        }
        //找到最大出现频率对应的子树和
        ArrayList<Integer> res = new ArrayList<>();
        for(Integer key:sumtoCount.keySet()){
            if(sumtoCount.get(key) == maxCount){
                res.add(key);
            }
        }
        //转换成Java数组
        int[] arr = new int[res.size()];
        for(int i = 0; i < arr.length;i++){
            arr[i] = res.get(i);
        }
        return arr;
    }



    //定义一个帮助函数,用来求得以各个结点为根的二叉树所有节点之和
    //定义:输入一个节点,返回以该节点为根的二叉树所有节点之和
    int sum (TreeNode root){
        //先进行边界值判断
        if(root == null){
            return 0;
        }
        int leftSum = sum(root.left);
        int rightSum = sum(root.right);
        int res = root.val + leftSum +rightSum;
        
        //后序遍历位置,同时记录子树和对应的频率
        sumtoCount.put(res,sumtoCount.getOrDefault(res,0)+1);

        return res;
    }
}

2022/6/20

[哈希表的使用-getOrDefault()](

posted @ 2022-06-20 21:41  抗争的小青年  阅读(29)  评论(0编辑  收藏  举报