Skip to content

Instantly share code, notes, and snippets.

@cixuuz
Last active September 5, 2017 13:17
Show Gist options
  • Save cixuuz/d4914382a5494fd4979e1d8e7845783b to your computer and use it in GitHub Desktop.
Save cixuuz/d4914382a5494fd4979e1d8e7845783b to your computer and use it in GitHub Desktop.
[508. Most Frequent Subtree Sum] #leetcode
class Solution {
// O(n) O(n)
public int[] findFrequentTreeSum(TreeNode root) {
HashMap<Integer, Integer> sums = new HashMap<Integer, Integer>();
dfs(root, sums);
List<Integer> res = new ArrayList<Integer>();
int max = 0;
for(Map.Entry<Integer, Integer> entry : sums.entrySet()) {
if (entry.getValue() > max) {
res = new ArrayList<Integer>();
res.add(entry.getKey());
max = entry.getValue();
} else if (entry.getValue() == max) {
res.add(entry.getKey());
}
}
return res.stream().mapToInt(i->i).toArray();
}
private Integer dfs(TreeNode node, HashMap<Integer, Integer> sums) {
if (node == null) return 0;
int sum = node.val;
sum += dfs(node.left, sums);
sum += dfs(node.right, sums);
sums.put(sum, sums.getOrDefault(sum, 0) + 1);
return sum;
}
}
class Solution2 {
private int maxCount = 0;
public int[] findFrequentTreeSum(TreeNode root) {
HashMap<Integer, Integer> sums = new HashMap<Integer, Integer>();
dfs(root, sums);
List<Integer> res = new ArrayList<Integer>();
for(Map.Entry<Integer, Integer> entry : sums.entrySet()) {
if (entry.getValue() == maxCount) {
res.add(entry.getKey());
}
}
int[] result = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
result[i] = res.get(i);
}
return result;
}
private Integer dfs(TreeNode node, HashMap<Integer, Integer> sums) {
if (node == null) return 0;
int sum = node.val;
sum += dfs(node.left, sums);
sum += dfs(node.right, sums);
sums.put(sum, sums.getOrDefault(sum, 0) + 1);
maxCount = Math.max(maxCount, sums.get(sum));
return sum;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment