Calculate sum of all nodes present in a level for each level of a Tree - GeeksforGeeks

29 Jun, 2021
Given a Generic Tree consisting of N nodes (rooted at 0) where each node is associated with a value, the task for each level of the Tree is to find the sum of all node values present at that level of the tree.
Examples:
Input: node_number = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, node_values = { 2, 3, 4, 4, 7, 6, 2, 3, 9, 1 }
Output: Sum of level 0 = 2Sum of level 1 = 7Sum of level 2 = 14Sum of level 3 = 18 Explanation :
Nodes on level 0 = {1} with value is 2
Nodes on level 1 = {2, 3} and their respective values are {3, 4}. Sum = 7.
Nodes on level 2 = {4, 5, 8} with values {4, 7, 3} respectively. Sum = 14.
Nodes on level 3 = {6, 7, 9, 10} with values {6, 2, 9, 1} respectively. Sum = 18
Input: node_number = { 1 }, node_values = { 10 }Output: Sum of level 0 = 10
Approach: Follow the steps below to solve the problem:
Traverse the tree using DFS or BFSStore the level of this node using this approach.Then, add the node values to the corresponding level of the node in an array, say sum[ ].Print the array sum[] showing the sum of all nodes on each level.
Traverse the tree using DFS or BFS
Store the level of this node using this approach.
Then, add the node values to the corresponding level of the node in an array, say sum[ ].
Print the array sum[] showing the sum of all nodes on each level.
Below is the implementation of the above approach :
C++
Java
Python3
C#
Javascript
// C++ implementation of// the above approach#include <bits/stdc++.h>using namespace std; // Function to add edges to the treevoid add_edge(int a, int b,              vector<vector<int> >& tree){    // 0-based indexing    a--, b--;     tree[a].push_back(b);    tree[b].push_back(a);} // Function to print sum of// nodes on all levels of a treevoid dfs(int u, int level, int par,         int node_values[], vector<vector<int> >& tree,         map<int, int>& sum, int& depth){    // update max depth of tree    depth = max(depth, level);     // Add value of current node    // to its corresponding level    sum[level] += node_values[u];     for (int child : tree[u]) {         if (child == par)            continue;         // Recursive traverse child nodes        dfs(child, level + 1, u, node_values,            tree, sum, depth);    }} // Function to calculate sum of// nodes of each level of the Treevoid getSum(int node_values[],            vector<vector<int> >& tree){    // Depth of the tree    int depth = 0;     // Stores sum at each level    map<int, int> sum;     dfs(0, 0,        -1, node_values,        tree, sum, depth);     // Print final sum    for (int i = 0; i <= depth; i++) {        cout << "Sum of level " << i             << " = " << sum[i] << endl;    }} // Driver Codeint32_t main(){     // Create a tree structure    int N = 10;     vector<vector<int> > tree(N);    add_edge(1, 2, tree);    add_edge(1, 3, tree);    add_edge(2, 4, tree);    add_edge(3, 5, tree);    add_edge(3, 8, tree);    add_edge(5, 6, tree);    add_edge(5, 7, tree);    add_edge(8, 9, tree);    add_edge(8, 10, tree);     int node_values[]        = { 2, 3, 4, 4, 7,            6, 2, 3, 9, 1 };     // Function call to get the sum    // of nodes of different level    getSum(node_values, tree);     return 0;}
// Java implementation of// the above approachimport java.io.*;import java.util.*; class GFG{     static Map<Integer, Integer> sum = new HashMap<>();static int depth = 0; // Function to add edges to the treestatic void add_edge(int a, int b,                     ArrayList<ArrayList<Integer>> tree){         // 0-based indexing    a--;    b--;      tree.get(a).add(b);    tree.get(b).add(a);}  // Function to print sum of// Nodes on all levels of a treestatic void dfs(int u, int level, int par,                int []node_values,                ArrayList<ArrayList<Integer>> tree){         // Update max depth of tree    depth = Math.max(depth, level);      // Add value of current node    // to its corresponding level    if (sum.containsKey(level))    {        sum.put(level, sum.get(level) +                       node_values[u]);    }    else        sum.put(level,node_values[u]);           for(int child : tree.get(u))    {        if (child == par)            continue;          // Recursive traverse child nodes        dfs(child, level + 1, u, node_values,            tree);    }}  // Function to calculate sum of// nodes of each level of the Treestatic void getSum(int []node_values,                   ArrayList<ArrayList<Integer>> tree){      dfs(0, 0, -1, node_values, tree);      // Print final sum    for(int i = 0; i <= depth; i++)    {        System.out.println("Sum of level " + (int) i +                                     " = " + sum.get(i));    }}  // Driver Codepublic static void main (String[] args){         // Create a tree structure    int N = 10;      ArrayList<ArrayList<Integer>> tree = new ArrayList<ArrayList<Integer>>();    for(int i = 0; i < N; i++)       tree.add(new ArrayList<Integer>());            add_edge(1, 2, tree);    add_edge(1, 3, tree);    add_edge(2, 4, tree);    add_edge(3, 5, tree);    add_edge(3, 8, tree);    add_edge(5, 6, tree);    add_edge(5, 7, tree);    add_edge(8, 9, tree);    add_edge(8, 10, tree);      int []node_values = { 2, 3, 4, 4, 7,                          6, 2, 3, 9, 1 };      // Function call to get the sum    // of nodes of different level    getSum(node_values, tree);}} // This code is contributed by avanitrachhadiya2155
# Python3 implementation of# the above approach # Function to add edges to the treedef add_edge(a, b):    global tree         # 0-based indexing    a, b = a - 1, b - 1    tree[a].append(b)    tree[b].append(a) # Function to prsum of# nodes on all levels of a treedef dfs(u, level, par, node_values):    global sum, tree, depth         # update max depth of tree    depth = max(depth, level)     # Add value of current node    # to its corresponding level    sum[level] = sum.get(level, 0) + node_values[u]    for child in tree[u]:        if (child == par):            continue         # Recursive traverse child nodes        dfs(child, level + 1, u, node_values) # Function to calculate sum of# nodes of each level of the Treedef getSum(node_values):    global sum, depth, tree         # Depth of the tree    # depth = 0     # Stores sum at each level    # map<int, int> sum    dfs(0, 0, -1, node_values)     # Prfinal sum    for i in range(depth + 1):        print("Sum of level", i, "=", sum[i]) # Driver Codeif __name__ == '__main__':     # Create a tree structure    N = 10    tree = [[] for i in range(N+1)]    sum = {}    depth = 0    add_edge(1, 2)    add_edge(1, 3)    add_edge(2, 4)    add_edge(3, 5)    add_edge(3, 8)    add_edge(5, 6)    add_edge(5, 7)    add_edge(8, 9)    add_edge(8, 10)    node_values = [2, 3, 4, 4, 7, 6, 2, 3, 9, 1]     # Function call to get the sum    # of nodes of different level    getSum(node_values)     # This code is contributed by mohit kumar 29.
// C# implementation of// the above approachusing System;using System.Collections.Generic;class GFG{  static Dictionary<int, int> sum = new Dictionary<int,int>();  static int depth = 0;   // Function to add edges to the treestatic void add_edge(int a, int b, List<List<int>> tree){       // 0-based indexing    a--;    b--;     tree[a].Add(b);    tree[b].Add(a);} // Function to print sum of// Nodes on all levels of a treestatic void dfs(int u, int level, int par,         int []node_values, List<List<int>> tree         ){       // update max depth of tree    depth = Math.Max(depth, level);     // Add value of current node    // to its corresponding level    if(sum.ContainsKey(level))      sum[level] += node_values[u];    else      sum[level] = node_values[u];     foreach (int child in tree[u]) {         if (child == par)            continue;         // Recursive traverse child nodes        dfs(child, level + 1, u, node_values,            tree);    }} // Function to calculate sum of// nodes of each level of the Treestatic void getSum(int []node_values, List<List<int>> tree){     dfs(0, 0, -1, node_values, tree);     // Print final sum    for (int i = 0; i <= depth; i++) {        Console.WriteLine("Sum of level " + (int) i + " = "+ sum[i]);    }} // Driver Codepublic static void Main(){     // Create a tree structure    int N = 10;     List<List<int> > tree = new List<List<int>>();    for(int i = 0; i < N; i++)       tree.Add(new List<int>());    add_edge(1, 2, tree);    add_edge(1, 3, tree);    add_edge(2, 4, tree);    add_edge(3, 5, tree);    add_edge(3, 8, tree);    add_edge(5, 6, tree);    add_edge(5, 7, tree);    add_edge(8, 9, tree);    add_edge(8, 10, tree);     int []node_values = {2, 3, 4, 4, 7,6, 2, 3, 9, 1};     // Function call to get the sum    // of nodes of different level    getSum(node_values, tree);}} // This code is contributed by bgangwar59.
<script> // Javascript implementation of// the above approachvar sum = new Map();var depth = 0;   // Function to add edges to the treefunction add_edge(a, b, tree){         // 0-based indexing    a--;    b--;     tree[a].push(b);    tree[b].push(a);} // Function to print sum of// Nodes on all levels of a treefunction dfs(u, level, par, node_values, tree){         // Update max depth of tree    depth = Math.max(depth, level);     // Push value of current node    // to its corresponding level    if (sum.has(level))        sum.set(level, sum.get(level) +                       node_values[u]);    else        sum.set(level, node_values[u])     for(var child of tree[u])    {        if (child == par)            continue;         // Recursive traverse child nodes        dfs(child, level + 1, u, node_values,            tree);    }} // Function to calculate sum of// nodes of each level of the Treefunction getSum(node_values, tree){    dfs(0, 0, -1, node_values, tree);     // Print final sum    for(var i = 0; i <= depth; i++)    {        document.write("Sum of level " + i +                       " = "+ sum.get(i) + "<br>");    }} // Driver Code // Create a tree structurevar N = 10;var tree = [];for(var i = 0; i < N; i++)   tree.push([]);    add_edge(1, 2, tree);add_edge(1, 3, tree);add_edge(2, 4, tree);add_edge(3, 5, tree);add_edge(3, 8, tree);add_edge(5, 6, tree);add_edge(5, 7, tree);add_edge(8, 9, tree);add_edge(8, 10, tree);var node_values = [ 2, 3, 4, 4, 7,6, 2, 3, 9, 1 ]; // Function call to get the sum// of nodes of different levelgetSum(node_values, tree); // This code is contributed by rrrtnx </script>
Sum of level 0 = 2
Sum of level 1 = 7
Sum of level 2 = 14
Sum of level 3 = 18
 
Time Complexity: O(N)Auxiliary Space: O(N)
 
mohit kumar 29
bgangwar59
avanitrachhadiya2155
rrrtnx
DFS
Tree Traversals
Recursion
Tree
Recursion
DFS
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Recursive Insertion Sort
Decimal to binary number using recursion
Sum of natural numbers using recursion
Practice Questions for Recursion | Set 1
How will you print numbers from 1 to 100 without using loop?
Tree Traversals (Inorder, Preorder and Postorder)
Binary Tree | Set 1 (Introduction)
Level Order Binary Tree Traversal
AVL Tree | Set 1 (Insertion)
Inorder Tree Traversal without Recursion