Find the sum of leafs at maximum level

Given a binary tree containing n nodes. The task is to find the sum of all the leaf nodes present at maximum level.

Examples:

Input:
              1
            /   \
           2     3
         /  \   /  \
        4   5   6   7
           /     \
          8       9

Output: 17
Leaf nodes 8 and 9 are at maximum level.
Their sum = (8 + 9) = 17.

Input:
              5
            /   \
           8     13
         /
        4 

Output: 4


Approach: Perform iterative level order traversal using queue and find the sum of the nodes at each level and if there are no children for every node at the current level mark this level as the maximum level. Sum of all the leaf nodes at maximum level will be the required answer.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Structure of a node of binary tree
struct Node {
    int data;
    Node *left, *right;
};
  
// Function to get a new node
Node* getNode(int data)
{
    // Allocate space
    Node* newNode = (Node*)malloc(sizeof(Node));
  
    // Put in the data
    newNode->data = data;
    newNode->left = newNode->right = NULL;
    return newNode;
}
  
// Function to return the sum of the
// leaf nodes at maximum level
int sumOfLeafNodesAtMaxLevel(Node* root)
{
    // If tree is empty
    if (!root)
        return 0;
  
    // If there is only one node
    if (!root->left && !root->right)
        return root->data;
  
    // Queue used for level order traversal
    queue<Node*> q;
    int leafSum = 0;
    bool f = 0;
  
    // Push root node in the queue 'q'
    q.push(root);
  
    while (true) {
  
        // Count number of nodes in the
        // current level
        int nc = q.size();
  
        // If the queue is empty, it means that the
        // last processed level was the maximum level
        if (nc == 0)
            return leafSum;
  
        // Initialize leafSum for current level
        leafSum = 0;
  
        // Traverse the current level nodes
        while (nc--) {
  
            // Get front element from 'q'
            Node* top = q.front();
            q.pop();
  
            // If it is a leaf node
            if (!top->left && !top->right) {
  
                // Accumulate data to 'sum'
                leafSum += top->data;
            }
            else {
  
                // If top's left and right child
                // exist then push them to 'q'
                if (top->left)
                    q.push(top->left);
                if (top->right)
                    q.push(top->right);
            }
        }
    }
}
  
// Driver code
int main()
{
    // Binary tree creation
    Node* root = getNode(1);
    root->left = getNode(2);
    root->right = getNode(3);
    root->left->left = getNode(4);
    root->left->right = getNode(5);
    root->right->left = getNode(6);
    root->right->right = getNode(7);
    root->left->right->left = getNode(8);
    root->right->left->right = getNode(9);
  
    cout << sumOfLeafNodesAtMaxLevel(root);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
  
class GFG {
  
    // Structure of a node of binary tree
    static class Node {
        int data;
        Node left, right;
    };
  
    // Function to get a new node
    static Node getNode(int data)
    {
        // Allocate space
        Node newNode = new Node();
  
        // Put in the data
        newNode.data = data;
        newNode.left = newNode.right = null;
        return newNode;
    }
  
    // Function to return the sum of the
    // leaf nodes at maximum level
    static int sumOfLeafNodesAtMaxLevel(Node root)
    {
        // If tree is empty
        if (root == null)
            return 0;
  
        // If there is only one node
        if (root.left == null && root.right == null)
            return root.data;
  
        // Queue used for level order traversal
        Queue<Node> q = new LinkedList<>();
        int leafSum = 0;
        boolean f = false;
  
        // Push root node in the queue 'q'
        q.add(root);
  
        while (true) {
  
            // Count number of nodes in the
            // current level
            int nc = q.size();
  
            // If the queue is empty, it means that the
            // last processed level was the maximum level
            if (nc == 0)
                return leafSum;
  
            // Initialize leafSum for current level
            leafSum = 0;
  
            // Traverse the current level nodes
            while (nc-- > 0) {
  
                // Get front element from 'q'
                Node top = q.peek();
                q.remove();
  
                // If it is a leaf node
                if (top.left == null && top.right == null) {
  
                    // Accumulate data to 'sum'
                    leafSum += top.data;
                }
                else {
  
                    // If top's left and right child
                    // exist then push them to 'q'
                    if (top.left != null)
                        q.add(top.left);
                    if (top.right != null)
                        q.add(top.right);
                }
            }
        }
    }
  
    // Driver code
    public static void main(String args[])
    {
        // Binary tree creation
        Node root = getNode(1);
        root.left = getNode(2);
        root.right = getNode(3);
        root.left.left = getNode(4);
        root.left.right = getNode(5);
        root.right.left = getNode(6);
        root.right.right = getNode(7);
        root.left.right.left = getNode(8);
        root.right.left.right = getNode(9);
  
        System.out.print(sumOfLeafNodesAtMaxLevel(root));
    }
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG {
  
    // Structure of a node of binary tree
    public class Node {
        public int data;
        public Node left, right;
    };
  
    // Function to get a new node
    static Node getNode(int data)
    {
        // Allocate space
        Node newNode = new Node();
  
        // Put in the data
        newNode.data = data;
        newNode.left = newNode.right = null;
        return newNode;
    }
  
    // Function to return the sum of the
    // leaf nodes at maximum level
    static int sumOfLeafNodesAtMaxLevel(Node root)
    {
        // If tree is empty
        if (root == null)
            return 0;
  
        // If there is only one node
        if (root.left == null && root.right == null)
            return root.data;
  
        // Queue used for level order traversal
        Queue<Node> q = new Queue<Node>();
        int leafSum = 0;
  
        // Push root node in the queue 'q'
        q.Enqueue(root);
  
        while (true) {
  
            // Count number of nodes in the
            // current level
            int nc = q.Count;
  
            // If the queue is empty, it means that the
            // last processed level was the maximum level
            if (nc == 0)
                return leafSum;
  
            // Initialize leafSum for current level
            leafSum = 0;
  
            // Traverse the current level nodes
            while (nc-- > 0) {
  
                // Get front element from 'q'
                Node top = q.Peek();
                q.Dequeue();
  
                // If it is a leaf node
                if (top.left == null && top.right == null) {
  
                    // Accumulate data to 'sum'
                    leafSum += top.data;
                }
                else {
  
                    // If top's left and right child
                    // exist then push them to 'q'
                    if (top.left != null)
                        q.Enqueue(top.left);
                    if (top.right != null)
                        q.Enqueue(top.right);
                }
            }
        }
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        // Binary tree creation
        Node root = getNode(1);
        root.left = getNode(2);
        root.right = getNode(3);
        root.left.left = getNode(4);
        root.left.right = getNode(5);
        root.right.left = getNode(6);
        root.right.right = getNode(7);
        root.left.right.left = getNode(8);
        root.right.left.right = getNode(9);
  
        Console.Write(sumOfLeafNodesAtMaxLevel(root));
    }
}
  
// This code contributed by Rajput-Ji

chevron_right


Output:

17

Time Complexity: O(n)
Auxiliary Space: O(n)



My Personal Notes arrow_drop_up

Discovering ways to develop a plane for soaring career goals

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, Rajput-Ji



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.