LeetCode 508. Most Frequent Subtree Sum

Problem

LeetCode 508. Most Frequent Subtree Sum

1. 题目简述

给出一颗二叉树,找出其所有子树并求子树和,找出频率最高的子树和(如果有频率一致的,返回多个)。例如:

Examples 1
Input:

   5
  /  \
 2   -3
return [2, -3, 4], since all the values happen only once, return all of them in any order.

Examples 2
Input:

   5
  /  \
 2   -5
return [2], since 2 happens twice, however -5 only occur once.

2. 算法思路

后序遍历 + HashMap:

很明显的后序遍历,对于每一个节点,都计算它的左子树和和右子树和,和自己本身的val相加,就是自己的子树和,统计完成后,找出最高频率,然后再次遍历HashMap,找出符合条件的sum和,最后再将储存结果的list转为array。

3. 解法

/**
 * 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 {

    Map<Integer, Integer> res = new HashMap();
    public int[] findFrequentTreeSum(TreeNode root) {
        int[] ret = new int[0];
        if (root == null) {
            return ret;
        }

        getSum(root);

        int maxFrequency = 0;
        for (Map.Entry<Integer, Integer> entry : res.entrySet()) {
            maxFrequency = Math.max(maxFrequency, entry.getValue());
        }

        List<Integer> list = new ArrayList();
        for (Map.Entry<Integer, Integer> entry : res.entrySet()) {
            if (maxFrequency == entry.getValue()) {
                list.add(entry.getKey());
            }
        }

        ret = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            ret[i] = list.get(i).intValue();
        }

        return ret;
    }

    private int getSum(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int sum = getSum(root.left) + getSum(root.right) + root.val;
        res.put(sum, (res.containsKey(sum) ? res.get(sum) : 0) + 1);

        return sum;
    }
}