Encuentra la suma de las hojas en el nivel máximo

Dado un árbol binario que contiene n Nodes. La tarea es encontrar la suma de todos los Nodes hoja presentes en el nivel máximo.
Ejemplos: 
 

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

Enfoque: Realice un recorrido de orden de nivel iterativo utilizando la cola y encuentre la suma de los Nodes en cada nivel y, si no hay elementos secundarios para cada Node en el nivel actual, marque este nivel como el nivel máximo. La suma de todos los Nodes hoja en el nivel máximo será la respuesta requerida.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// 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;
}

Java

// 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

Python3

# Python implementation of the approach
# Structure of a node of binary tree
class Node:
    def __init__(self):
     
        self.data = 0
        self.left = None
        self.right = None
 
# Function to get a new node
def getNode(data):
 
    # Allocate space
    newNode = Node()
    # Put in the data
    newNode.data = data
    newNode.left = newNode.right = None
    return newNode
 
# Function to return the sum of the
# leaf nodes at maximum level
def sumOfLeafNodesAtMaxLevel(root):
 
    # If tree is empty
    if (root == None):
        return 0
    # If there is only one node
    if (root.left == None and root.right == None):
        return root.data
    # Queue used for level order traversal
    q = []
    leafSum = 0
    # append root node in the queue 'q'
    q.append(root)
    while (True):
        # Count number of nodes in the
        # current level
        nc = len(q)
        # 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'
            top = q[0]
            q.pop(0)
            # If it is a leaf node
            if (top.left == None and top.right == None):
                # Accumulate data to 'sum'
                leafSum += top.data
             
            else:
                # If top's left and right child
                # exist then append them to 'q'
                if (top.left != None):
                    q.append(top.left)
                if (top.right != None):
                    q.append(top.right)
             
            nc -= 1   
 
# Driver code
# Binary tree creation
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)
print(sumOfLeafNodesAtMaxLevel(root))
 
# This code is contributed by shinjanpatra

C#

// 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

Javascript

<script>
 
// JavaScript implementation of the approach
// Structure of a node of binary tree
class Node {
    constructor()
    {
        this.data = 0;
        this.left = null;
        this.right = null;
    }
};
 
// Function to get a new node
function getNode(data)
{
    // Allocate space
    var 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
function sumOfLeafNodesAtMaxLevel(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
    var q = [];
    var leafSum = 0;
    // Push root node in the queue 'q'
    q.push(root);
    while (true) {
        // Count number of nodes in the
        // current level
        var nc = q.length;
        // 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'
            var top = q[0];
            q.shift();
            // 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.push(top.left);
                if (top.right != null)
                    q.push(top.right);
            }
        }
    }
}
 
// Driver code
// Binary tree creation
var 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);
document.write(sumOfLeafNodesAtMaxLevel(root));
 
</script>
Producción: 

17

 

Complejidad temporal: O(n) 
Espacio auxiliar: O(n)
 

Publicación traducida automáticamente

Artículo escrito por Shivam.Pradhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *