Kth Largest Sum in a Binary Tree

Updated on 04 June, 2025
Kth Largest Sum in a Binary Tree header image

Problem Statement

In this problem, we are provided with a binary tree's root node and a positive integer k. The concept of level sum refers to the cumulative value of all nodes that exist on the same hierarchical level within the tree. The task is to determine the kth largest sum among these level sums. If the tree doesn't have sufficient levels to evaluate the kth largest sum (that is, if there are fewer levels than k), the function should return -1. It's important to note that the levels are considered based on the depth from the root-node and each node's distance determines its level.

Examples

Example 1

Input:

root = [5,8,9,2,1,3,7,4,6], k = 2

Output:

13

Explanation:

The level sums are the following:
- Level 1: 5.
- Level 2: 8 + 9 = 17.
- Level 3: 2 + 1 + 3 + 7 = 13.
- Level 4: 4 + 6 = 10.
The 2nd largest level sum is 13.

Example 2

Input:

root = [1,2,null,3], k = 1

Output:

3

Explanation:

The largest level sum is 3.

Constraints

  • The number of nodes in the tree is n.
  • 2 <= n <= 105
  • 1 <= Node.val <= 106
  • 1 <= k <= n

Approach and Intuition

Understanding the Computation of Level Sums

  1. Traversal Method: To calculate the level sums efficiently, a breadth-first search (BFS) approach is typically used. This algorithm traverses the tree level by level, starting from the root. BFS is apt for this task as it inherently processes all nodes at a particular level before moving to the next.

  2. Queue Utilization: A queue helps in managing the nodes at each level. We enqueue the root node initially and then continuously dequeue nodes while enqueuing their child nodes until the queue is empty.

  3. Sum Calculation: While processing each level, we can sum the values of all nodes at that level and then store these sums in a list or array.

Determining the kth Largest Level Sum

  1. Sort and Select: Once we have an array of the sums of each level:

    • We can sort this array in descending order.
    • The kth element in this sorted array will be our result for the kth largest sum.
  2. Handling Edge Cases: If the number of levels is less than k, meaning the array's length is shorter than k, we should return -1 as specified.

Example Walkthrough

  • For Example 1:

    • The levels and their associated sums would be computed using the BFS approach:
      • Level 1: sum = 5
      • Level 2: sum = 17 (from 8+9)
      • Level 3: sum = 13 (from 2+1+3+7)
      • Level 4: sum = 10 (from 4+6)
    • After arranging these sums in descending order [17, 13, 10, 5], the second-largest sum is 13.
  • For Example 2:

    • The levels and their sums:
      • Level 1: sum = 1
      • Level 2: sum = 2
      • Level 3: not applicable as there are non-successive levels
    • With [2, 1] as the sorted sums, the largest value is 2, which is present at the start of the sorted sequence.

In conclusion, the primary operations involve BFS for level-wise traversal and sum calculations followed by sorting to determine the kth largest sum, coupled with checks to handle cases where fewer levels than k exist.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    long findKthLargestSum(TreeNode* root, int k) {
        priority_queue<long, vector<long>, greater<long> > minHeap;

        queue<TreeNode*> levelNodes;
        levelNodes.push(root);
        while (!levelNodes.empty()) {
            int levelSize = levelNodes.size();
            long levelSum = 0;
            for (int i = 0; i < levelSize; i++) {
                TreeNode* currentNode = levelNodes.front();
                levelNodes.pop();
                levelSum += currentNode->val;
                if (currentNode->left) {
                    levelNodes.push(currentNode->left);
                }
                if (currentNode->right) {
                    levelNodes.push(currentNode->right);
                }
            }
            minHeap.push(levelSum);
            if (minHeap.size() > k) {
                minHeap.pop();
            }
        }
        if (minHeap.size() < k) return -1;
        return minHeap.top();
    }
};

To solve the problem of finding the Kth largest sum of level sums in a binary tree using C++:

  1. Define a priority_queue with a min-heap configuration to store the level sums. Use priority_queue<long, vector<long>, greater<long>> minHeap; for efficient retrieval and storage of the smallest elements.

  2. Utilize queue<TreeNode*> levelNodes; to manage the nodes at each level of the binary tree. Initialize it by pushing the root node.

  3. Employ a standard BFS (Breadth-First Search) loop with while (!levelNodes.empty()). Within the loop, calculate the sum of values of nodes that are at the same level.

    • For each level of nodes, initialize long levelSum = 0; and iterate through all nodes at that current level. For each node, add its value to levelSum.

    • Add each child of the current node to the queue for subsequent level calculations.

  4. After calculating levelSum, push it onto the min heap. Ensure that the size of the heap does not exceed k by popping the top (smallest) element if necessary.

  5. After processing all levels, check if the min heap size is less than k, indicating there aren't enough levels. In such cases, return -1.

  6. Otherwise, retrieve and return the top element of the min-heap, which represents the Kth largest level sum.

This solution methodically captures the sum of values at each level of a binary tree and maintains a controlled-size heap to efficiently track and retrieve the Kth largest sum, ensuring optimal performance and space utilization.

java
class Solution {

    public long findKthLargestSum(TreeNode root, int k) {
        PriorityQueue<Long> minHeap = new PriorityQueue<>();

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            // Processing the current level
            int levelSize = queue.size();
            long levelSum = 0;
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                levelSum += node.val;
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            minHeap.add(levelSum);
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }
        return minHeap.size() < k ? -1 : minHeap.peek();
    }
}

The provided Java solution aims to find the kth largest sum of levels in a binary tree. The following key steps encapsulate the method:

  1. Initialize a PriorityQueue<Long> minHeap to store the level sums and maintain the smallest values on the top as it's a min-heap.

  2. Use a Queue<TreeNode> queue to traverse the tree level-by-level, initiating the queue with the root node.

  3. Inside the main while loop, process each level of the tree:

    • Determine the number of nodes (levelSize) at the current level.
    • Initialize levelSum to accumulate the values of nodes at each level.
  4. Traverse through each node at the current level (levelSize). For each node:

    • Add the value of the node to levelSum.
    • If left child exists, enqueue it.
    • If right child exists, enqueue it.
  5. Post level processing:

    • Add levelSum to minHeap.
    • Ensure minHeap does not hold more than k elements. If it does, remove the smallest element (top of the heap) to only retain the k largest level sums.
  6. After processing all tree levels:

    • If minHeap contains fewer than k elements, return -1, indicating fewer than k levels.
    • Otherwise, return the top element of minHeap, which represents the kth largest sum among the level sums.

This solution efficiently captures the desired kth largest level sum by maintaining a bounded size for the heap and selectively keeping only the top sums.

python
class Solution:
    def findKthLargestSum(self, root, k):
        min_heap = []
        level_nodes = deque()
        level_nodes.append(root)

        while level_nodes:
            level_size = len(level_nodes)
            current_level_sum = 0
            for _ in range(level_size):
                current = level_nodes.popleft()
                current_level_sum += current.val
                if current.left:
                    level_nodes.append(current.left)
                if current.right:
                    level_nodes.append(current.right)

            heapq.heappush(min_heap, current_level_sum)
            if len(min_heap) > k:
                heapq.heappop(min_heap)
        return min_heap[0] if len(min_heap) == k else -1

The provided Python code defines a method to find the K-th largest sum of levels in a binary tree. This solution employs a breadth-first search (BFS) approach using a queue to traverse the binary tree levels and a min-heap to efficiently track the K largest sums. Here are the key steps in the algorithm:

  1. Initialize min_heap to store the sums of tree levels.
  2. Use a deque named level_nodes to perform a level-order traversal (BFS) of the tree. Start by appending the root node to level_nodes.
  3. While level_nodes is not empty, calculate the sum of node values at the current level:
    • Determine the number of nodes level_size at the current level.
    • Traverse through these nodes, summing up their values and adding their children to level_nodes for the next level.
  4. Push the sum of the current level to min_heap.
  5. If the size of min_heap exceeds K, remove the smallest element using heapq.heappop to only keep the K largest sums.
  6. After processing all levels, check the size of min_heap. If it matches K, return the smallest element in min_heap (which is the K-th largest sum). If not, return -1 as an error signaling insufficient levels.

This technique ensures that the algorithm efficiently maintains only the top K level sums in terms of size, resulting in an overall time complexity of O(N log K) where N is the total number of nodes in the binary tree.

Comments

No comments yet.