Leetcode Java Most Frequent Subtree Sum
업데이트:
문제
코드
class Solution {
private int max = 0;
public int[] findFrequentTreeSum(TreeNode root) {
List<Integer> list = new ArrayList<>();
this.dfs(root, new HashMap<>(), list);
int[] result = new int[list.size()];
for (int idx = 0; idx < list.size(); idx++) {
result[idx] = list.get(idx);
}
return result;
}
private int dfs(TreeNode root, Map<Integer, Integer> map, List<Integer> list) {
if (root == null) {
return 0;
}
int sum = root.val + this.dfs(root.left, map, list) + this.dfs(root.right, map, list);
int frequency = map.getOrDefault(sum, 0) + 1;
map.put(sum, frequency);
if (frequency > this.max) {
max = frequency;
list.clear();
list.add(sum);
} else if (frequency == this.max) {
list.add(sum);
}
return sum;
}
}
결과
설명
-
root 내 빈도수가 가장 많은 하위 트리의 합계를 반환하는 문제이다.
-
max는 최고 빈도수를 저장할 전역 변수로, 0으로 초기화한다.
-
빈도수가 가장 많은 하위 트리의 합계를 넣을 list를 정의하고, 새 HashMap과 함께 4번에서 정의한 dfs(TreeNode root, Map<Integer, Integer> map, List
list) 메서드를 수행한다. - DFS 방식으로 root를 탐색하여 list에 결과를 넣어줄 dfs(TreeNode root, Map<Integer, Integer> map, List
list) 메서드를 정의한다. - root가 null인 경우, 0을 반환한다.
- sum에 root의 val 값과 left와 right의 TreeNode로 재귀 호출을 수행한 결과를 합쳐준다.
- frequency에 map에서 sum에 해당하는 값을 가져와 1을 더한 값을 저장하고, 다시 해당 값을 넣어준다.
- max보다 frequency가 높은 경우 최고 빈도인 부분 노드가 발생하였으므로, list를 초기화하고 sum을 넣어준다.
- max와 frequency가 같은 경우 동일한 최고 빈도의 부분 노드이므로, list에 sum을 넣어준다.
- 수행이 완료되었으면 sum을 반환한다.
-
list의 값들을 정수 배열로 변환해서 넣을 result 배열을 list 크기로 초기화하고, list의 모든 값들을 result에 넣어준다.
- 반복이 완료되면 주어진 문제의 결과로 result를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기