LeetCode 508. Most Frequent Subtree Sum
2020-05-22 12:36:15 # leetcode

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. 解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 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;
}
}