Leetcode Java Kth Largest Sum in a Binary Tree
업데이트:
문제
코드
/**
* 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 {
public long kthLargestLevelSum(TreeNode root, int k) {
Queue<Long> result = new PriorityQueue<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
long sum = 0;
while (size-- > 0) {
TreeNode temp = queue.poll();
sum += temp.val;
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
}
result.add(sum);
if (result.size() > k) {
result.poll();
}
}
return result.size() < k ? -1 : result.peek();
}
}
결과
설명
- 이진 트리인 root의 레벨 별 값들의 합계를 구할 때, k번째 큰 합계를 반환하는 문제이다.
- 단, 트리의 레벨이 k 이하인 k번째 큰 합계가 존재하지 않으면 -1을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 레벨 별 합계를 오름차순으로 관리하기 위한 변수로, PriorityQueue로 초기화한다.
- queue는 각 노드를 순차적으로 넣어 합계를 계산하기 위한 변수로, LinkedList로 초기화하고 root를 넣어준다.
- queue가 비어있지 않을 때 까지 아래를 반복한다.
- size에 queue의 크기를 저장한 변수이고, 합계를 저장할 sum은 0으로 초기화한다.
- size가 0 초과일 때 까지 size를 감소시키며 아래를 반복한다.
- temp에 queue의 노드를 꺼내 넣어준다.
- sum에 temp의 val 값을 더해 합계를 계산한다.
- queue에 temp의 left와 right 노드가 존재하면 순차적으로 넣어준다.
- result에 현재 레벨의 합계인 sum을 넣어준다.
- result의 크기가 k 초과이면 result에서 첫 값인 가장 작은 k 범위를 초과한 값을 제거해준다.
- 반복이 완료되면 result의 길이가 k보다 작으면 k번째 값이 없으므로 -1을, 그렇지 않은 경우 result의 첫 값인 k번째 큰 합계를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기