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는 여기에서 확인 가능합니다.
  
  
댓글남기기