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

245 阅读1分钟

题目介绍

力扣508题:leetcode-cn.com/problems/mo…

image.png

方法:后序遍历

由于要求出以当前节点为根的所有子树元素和,很容易能想到就要使用后序遍历的方式,于是先简单写出后序遍历框架,如下:

public int  postOrder(TreeNode root) {
    if(root == null) {
        return 0;
    }
    int left = postOrder(root.left);
    int right = postOrder(root.right);
    //当前节点的子树和就等于当前节点的值加上左右子树的值
    return left + right + root.val;
}

接着我们还要计算子树和出现次数,很容易也能想到使用HashMap来存储,key为子树和,value为子树和出现的次数,在遍历的时候顺带更新HashMap中的值。最后再遍历这个Map,就能够得到出现次数最多的子树和,代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //存储每个子树和出现的次数,key:子树的和,value:子树和出现的次数
    Map<Integer,Integer> data = new HashMap<>();
    List<Integer> resultList = new ArrayList<>(); 
    int maxFrequent = 0;

    public int[] findFrequentTreeSum(TreeNode root) {
        postOrder(root);
        Set<Map.Entry<Integer, Integer>> entries = data.entrySet();
        for (Map.Entry<Integer, Integer> entry : entries) {
            //找到出现次数最多的子树和,存入到resultList集合中
            if(entry.getValue() == maxFrequent) {
                resultList.add(entry.getKey());
            }
        }

        int[] mode = new int[resultList.size()];
        for (int i = 0; i < resultList.size(); ++i) {
            mode[i] = resultList.get(i);
        }
        return mode;
    }

    //使用后续的方式遍历
    public int  postOrder(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int left = postOrder(root.left);
        int right = postOrder(root.right);
        update(left + right + root.val);
        return left + right + root.val;
    }

    //更新子树和出现的次数
    public void update(int x) {
        if(data.get(x) != null) {
            data.put(x , data.get(x) + 1);
        }else {
            data.put(x , 1);
        }
        //刷新出现次数的最大值
        maxFrequent = Math.max(maxFrequent, data.get(x));
    }
}