Kth Largest Sum in a Binary Tree

medium tree bfs heap sorting

Problem

Given the root of a binary tree and an integer k, a level sum is the total of all node values at one depth of the tree. Return the kth largest of these level sums. If the tree has fewer than k levels, return -1.

Inputtree = [5, 8, 9, 2, 1, 3, 7, 4, 6], k = 2
Output13
Level sums are 5, 17, 13, 10. Sorted high to low: 17, 13, 10, 5. The 2nd largest is 13.

def kth_largest_level_sum(root, k):
    sums = []
    level = [root]
    while level:
        total = sum(n.val for n in level)
        sums.append(total)
        nxt = []
        for n in level:
            if n.left: nxt.append(n.left)
            if n.right: nxt.append(n.right)
        level = nxt
    if len(sums) < k:
        return -1
    sums.sort(reverse=True)
    return sums[k - 1]
function kthLargestLevelSum(root, k) {
  const sums = [];
  let level = [root];
  while (level.length) {
    const total = level.reduce((s, n) => s + n.val, 0);
    sums.push(total);
    const next = [];
    for (const n of level) {
      if (n.left) next.push(n.left);
      if (n.right) next.push(n.right);
    }
    level = next;
  }
  if (sums.length < k) return -1;
  sums.sort((a, b) => b - a);
  return sums[k - 1];
}
class Solution {
    public long kthLargestLevelSum(TreeNode root, int k) {
        List<Long> sums = new ArrayList<>();
        List<TreeNode> level = new ArrayList<>(); level.add(root);
        while (!level.isEmpty()) {
            long total = 0; for (TreeNode n : level) total += n.val;
            sums.add(total);
            List<TreeNode> next = new ArrayList<>();
            for (TreeNode n : level) {
                if (n.left != null) next.add(n.left);
                if (n.right != null) next.add(n.right);
            }
            level = next;
        }
        if (sums.size() < k) return -1;
        sums.sort(Collections.reverseOrder());
        return sums.get(k - 1);
    }
}
long long kthLargestLevelSum(TreeNode* root, int k) {
    vector<long long> sums;
    vector<TreeNode*> level = { root };
    while (!level.empty()) {
        long long total = 0; for (auto* n : level) total += n->val;
        sums.push_back(total);
        vector<TreeNode*> next;
        for (auto* n : level) {
            if (n->left) next.push_back(n->left);
            if (n->right) next.push_back(n->right);
        }
        level = next;
    }
    if ((int)sums.size() < k) return -1;
    sort(sums.rbegin(), sums.rend());
    return sums[k - 1];
}
Time: O(n + L log L) Space: O(w)