Skip to content
Related Articles

Related Articles

Improve Article

Sum of all elements of N-ary Tree

  • Difficulty Level : Hard
  • Last Updated : 24 Jun, 2021

Given an N-ary tree, find sum of all elements in it.
 

Example : 
 

Input : Above tree
Output : Sum is 536

 

Approach : The approach used is similar to Level Order traversal in a binary tree. Start by pushing the root node in the queue. And for each node, while popping it from queue, add the value of this node in the sum variable and push the children of the popped element in the queue. In case of a generic tree store child nodes in a vector. Thus, put all elements of the vector in the queue.
Below is the implementation of the above idea : 
 



C++




// C++ program to find sum of all
// elements in generic tree
#include <bits/stdc++.h>
using namespace std;
 
// Represents a node of an n-ary tree
struct Node {
    int key;
    vector<Node*> child;
};
 
// Utility function to create a new tree node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    return temp;
}
 
// Function to compute the sum
// of all elements in generic tree
int sumNodes(Node* root)
{
    // initialize the sum variable
    int sum = 0;
 
    if (root == NULL)
        return 0;
 
    // Creating a queue and pushing the root
    queue<Node*> q;
    q.push(root);
 
    while (!q.empty()) {
        int n = q.size();
 
        // If this node has children
        while (n > 0) {
 
            // Dequeue an item from queue and
            // add it to variable "sum"
            Node* p = q.front();
            q.pop();
            sum += p->key;
 
            // Enqueue all children of the dequeued item
            for (int i = 0; i < p->child.size(); i++)
                q.push(p->child[i]);
            n--;
        }
    }
    return sum;
}
 
// Driver program
int main()
{
    // Creating a generic tree
    Node* root = newNode(20);
    (root->child).push_back(newNode(2));
    (root->child).push_back(newNode(34));
    (root->child).push_back(newNode(50));
    (root->child).push_back(newNode(60));
    (root->child).push_back(newNode(70));
    (root->child[0]->child).push_back(newNode(15));
    (root->child[0]->child).push_back(newNode(20));
    (root->child[1]->child).push_back(newNode(30));
    (root->child[2]->child).push_back(newNode(40));
    (root->child[2]->child).push_back(newNode(100));
    (root->child[2]->child).push_back(newNode(20));
    (root->child[0]->child[1]->child).push_back(newNode(25));
    (root->child[0]->child[1]->child).push_back(newNode(50));
 
    cout << sumNodes(root) << endl;
 
    return 0;
}

Java




// Java program to find sum of all
// elements in generic tree
import java.util.*;
 
class GFG
{
 
// Represents a node of an n-ary tree
static class Node
{
    int key;
    Vector<Node> child;
};
 
// Utility function to create a new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.child = new Vector<>();
    return temp;
}
 
// Function to compute the sum
// of all elements in generic tree
static int sumNodes(Node root)
{
    // initialize the sum variable
    int sum = 0;
 
    if (root == null)
        return 0;
 
    // Creating a queue and pushing the root
    Queue<Node> q = new LinkedList<>();
    q.add(root);
 
    while (!q.isEmpty())
    {
        int n = q.size();
 
        // If this node has children
        while (n > 0)
        {
 
            // Dequeue an item from queue and
            // add it to variable "sum"
            Node p = q.peek();
            q.remove();
            sum += p.key;
 
            // Enqueue all children of the dequeued item
            for (int i = 0; i < p.child.size(); i++)
                q.add(p.child.get(i));
            n--;
        }
    }
    return sum;
}
 
// Driver program
public static void main(String[] args)
{
    // Creating a generic tree
    Node root = newNode(20);
    (root.child).add(newNode(2));
    (root.child).add(newNode(34));
    (root.child).add(newNode(50));
    (root.child).add(newNode(60));
    (root.child).add(newNode(70));
    (root.child.get(0).child).add(newNode(15));
    (root.child.get(0).child).add(newNode(20));
    (root.child.get(1).child).add(newNode(30));
    (root.child.get(2).child).add(newNode(40));
    (root.child.get(2).child).add(newNode(100));
    (root.child.get(2).child).add(newNode(20));
    (root.child.get(0).child.get(1).child).add(newNode(25));
    (root.child.get(0).child.get(1).child).add(newNode(50));
 
    System.out.print(sumNodes(root) +"\n");
}
}
 
// This code is contributed by 29AjayKumar

C#




     
// C# program to find sum of all
// elements in generic tree
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Represents a node of an n-ary tree
class Node
{
    public int key;
    public List<Node> child;
};
 
// Utility function to create a new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.child = new List<Node>();
    return temp;
}
 
// Function to compute the sum
// of all elements in generic tree
static int sumNodes(Node root)
{
    // initialize the sum variable
    int sum = 0;
 
    if (root == null)
        return 0;
 
    // Creating a queue and pushing the root
    Queue<Node> q = new Queue<Node>();
    q.Enqueue(root);
 
    while (q.Count != 0)
    {
        int n = q.Count;
 
        // If this node has children
        while (n > 0)
        {
 
            // Dequeue an item from queue and
            // add it to variable "sum"
            Node p = q.Peek();
            q.Dequeue();
            sum += p.key;
 
            // Enqueue all children of the dequeued item
            for (int i = 0; i < p.child.Count; i++)
                q.Enqueue(p.child[i]);
            n--;
        }
    }
    return sum;
}
 
// Driver program
public static void Main(String[] args)
{
    // Creating a generic tree
    Node root = newNode(20);
    (root.child).Add(newNode(2));
    (root.child).Add(newNode(34));
    (root.child).Add(newNode(50));
    (root.child).Add(newNode(60));
    (root.child).Add(newNode(70));
    (root.child[0].child).Add(newNode(15));
    (root.child[0].child).Add(newNode(20));
    (root.child[1].child).Add(newNode(30));
    (root.child[2].child).Add(newNode(40));
    (root.child[2].child).Add(newNode(100));
    (root.child[2].child).Add(newNode(20));
    (root.child[0].child[1].child).Add(newNode(25));
    (root.child[0].child[1].child).Add(newNode(50));
 
    Console.Write(sumNodes(root) +"\n");
}
}
 
// This code is contributed by PrinciRaj1992

Javascript




<script>
 
// JavaScript program to find sum of all
// elements in generic tree
 
// Represents a node of an n-ary tree
class Node
{
  constructor()
  {
    this.key = 0;
    this.child = [];
  }
};
 
// Utility function to create a new tree node
function newNode(key)
{
    var temp = new Node();
    temp.key = key;
    temp.child = [];
    return temp;
}
 
// Function to compute the sum
// of all elements in generic tree
function sumNodes(root)
{
    // initialize the sum variable
    var sum = 0;
 
    if (root == null)
        return 0;
 
    // Creating a queue and pushing the root
    var q = [];
    q.push(root);
 
    while (q.length != 0)
    {
        var n = q.length;
 
        // If this node has children
        while (n > 0)
        {
 
            // Dequeue an item from queue and
            // add it to variable "sum"
            var p = q[0];
            q.shift();
            sum += p.key;
 
            // push all children of the dequeued item
            for (var i = 0; i < p.child.length; i++)
                q.push(p.child[i]);
            n--;
        }
    }
    return sum;
}
 
// Driver program
// Creating a generic tree
var root = newNode(20);
(root.child).push(newNode(2));
(root.child).push(newNode(34));
(root.child).push(newNode(50));
(root.child).push(newNode(60));
(root.child).push(newNode(70));
(root.child[0].child).push(newNode(15));
(root.child[0].child).push(newNode(20));
(root.child[1].child).push(newNode(30));
(root.child[2].child).push(newNode(40));
(root.child[2].child).push(newNode(100));
(root.child[2].child).push(newNode(20));
(root.child[0].child[1].child).push(newNode(25));
(root.child[0].child[1].child).push(newNode(50));
document.write(sumNodes(root) +"<br>");
 
 
</script>

Output:  

536

Time Complexity: O(N), where N is the number of nodes in tree. 
Auxiliary Space: O(N), where N is the number of nodes in tree.
 

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :