Maximum value at each level in an N-ary Tree - GeeksforGeeks

22 Jun, 2021
Given a N-ary Tree consisting of nodes valued in the range [0, N – 1] and an array arr[] where each node i is associated to value arr[i], the task is to print the maximum value associated with any node at each level of the given N-ary Tree.
Examples:
Input: N = 8, Edges[][] = {{0, 1}, {0, 2}, {0, 3}, {1, 4}, {1, 5}, {3, 6}, {6, 7}}, arr[] = {4, 2, 3, -5, -1, 3, -2, 6} Output: 4 3 6 Explanation: Below is the given N-ary Tree: 
The Max of all nodes of the 0th level is 4. The Max of all nodes of the 1st level is 3. The Max of all nodes of the 2nd level is 6.
Input: N = 10, Edges[][] = {{0, 1}, {0, 2}, {0, 3}, {1, 4}, {1, 5}, {3, 6}, {6, 7}, {6, 8}, {6, 9}}, arr[] = {1, 2, -1, 3, 4, 5, 8, 6, 12, 7} Output: 1 3 8 12 Explanation: Below is the given N-ary Tree: 
The Max of all nodes of the 0th level is 1. The Max of all nodes of the 1st level is 3. The Max of all nodes of the 2nd level is 8. The Max of all nodes of the 3rd level is 12.  
Approach: This problem can be solved by performing the Level Order Traversal of the given tree. While traversing the tree, process nodes of each level separately. For every level being processed, compute the maximum value of all nodes in the level. Follow the steps below: 
Store all the child nodes of the current level in a Queue and pop the nodes of the current level one by one.Find the maximum value of all the popped nodes of the current level.Print the maximum value obtained in the above step.Follow the above steps for each level of the given Tree and print the maximum value for each level respectively.
Store all the child nodes of the current level in a Queue and pop the nodes of the current level one by one.
Find the maximum value of all the popped nodes of the current level.
Print the maximum value obtained in the above step.
Follow the above steps for each level of the given Tree and print the maximum value for each level respectively.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach #include <bits/stdc++.h>using namespace std; // Function to find the maximum value// at each level of N-ary treeint maxAtLevel(int N, int M,               vector<int> Value,               int Edges[][2]){    // Stores the adjacency list    vector<int> adj[N];     // Create the adjacency list    for (int i = 0; i < M; i++) {        int u = Edges[i][0];        int v = Edges[i][1];        adj[u].push_back(v);    }     // Perform level order traversal    // of nodes at each level    queue<int> q;     // Push the root node    q.push(0);     // Iterate until queue is empty    while (!q.empty()) {         // Get the size of queue        int count = q.size();         int maxVal = 0;         // Iterate for all the nodes        // in the queue currently        while (count--) {             // Dequeue an node from queue            int temp = q.front();            q.pop();             maxVal = max(maxVal,                         Value[temp]);             // Enqueue the children of            // dequeued node            for (int i = 0;                 i < adj[temp].size();                 i++) {                q.push(adj[temp][i]);            }        }         // Print the result        cout << maxVal << " ";    }} // Driver Codeint main(){    // Number of nodes    int N = 10;     // Edges of the N-ary tree    int Edges[][2] = { { 0, 1 }, { 0, 2 },                       { 0, 3 }, { 1, 4 },                       { 1, 5 }, { 3, 6 },                       { 6, 7 }, { 6, 8 },                       { 6, 9 } };     // Given cost    vector<int> Value = { 1, 2, -1, 3, 4,                          5, 8, 6, 12, 7 };     // Function Call    maxAtLevel(N, N - 1, Value, Edges);     return 0;}
// Java program for// the above approachimport java.util.*;class GFG{ // Function to find the maximum value// at each level of N-ary treestatic void maxAtLevel(int N, int M,                       int []Value,                       int Edges[][]){  // Stores the adjacency list  Vector<Integer> []adj = new Vector[N];     for (int i = 0; i < adj.length; i++)    adj[i] = new Vector<Integer>();   // Create the adjacency list  for (int i = 0; i < M; i++)  {    int u = Edges[i][0];    int v = Edges[i][1];    adj[u].add(v);  }   // Perform level order traversal  // of nodes at each level  Queue<Integer> q = new LinkedList<>();   // Push the root node  q.add(0);   // Iterate until queue is empty  while (!q.isEmpty())  {    // Get the size of queue    int count = q.size();     int maxVal = 0;     // Iterate for all the nodes    // in the queue currently    while (count-- > 0)    {      // Dequeue an node from queue      int temp = q.peek();      q.remove();       maxVal = Math.max(maxVal, Value[temp]);       // Enqueue the children of      // dequeued node      for (int i = 0;               i < adj[temp].size(); i++)      {        q.add(adj[temp].get(i));      }    }     // Print the result    System.out.print(maxVal + " ");  }} // Driver Codepublic static void main(String[] args){  // Number of nodes  int N = 10;   // Edges of the N-ary tree  int Edges[][] = {{0, 1}, {0, 2},                   {0, 3}, {1, 4},                   {1, 5}, {3, 6},                   {6, 7}, {6, 8},                   {6, 9}};   // Given cost  int []Value = {1, 2, -1, 3, 4,                 5, 8, 6, 12, 7};   // Function Call  maxAtLevel(N, N - 1, Value, Edges);}} // This code is contributed by 29AjayKumar
# Python3 program for the above approach # Function to find the maximum value# at each level of N-ary treedef maxAtLevel(N, M, Value, Edges):         # Stores the adjacency list    adj = [[] for i in range(N)]     # Create the adjacency list    for i in range(M):        u = Edges[i][0]        v = Edges[i][1]        adj[u].append(v)     # Perform level order traversal    # of nodes at each level    q = []     # Push the root node    q.append(0)     # Iterate until queue is empty    while (len(q)):                 # Get the size of queue        count = len(q)         maxVal = 0         # Iterate for: all the nodes        # in the queue currently        while (count):                         # Dequeue an node from queue            temp = q[0]            q.remove(q[0])             maxVal = max(maxVal, Value[temp])             # Enqueue the children of            # dequeued node            for i in range(len(adj[temp])):                q.append(adj[temp][i])                             count -= 1         # Print the result        print(maxVal, end = " ") # Driver Codeif __name__ == '__main__':         # Number of nodes    N = 10     # Edges of the N-ary tree    Edges = [ [ 0, 1 ], [ 0, 2 ],              [ 0, 3 ], [ 1, 4 ],              [ 1, 5 ], [ 3, 6 ],              [ 6, 7 ], [ 6, 8 ],              [ 6, 9 ] ]     # Given cost    Value = [ 1, 2, -1, 3, 4,              5, 8, 6, 12, 7 ]     # Function Call    maxAtLevel(N, N - 1, Value, Edges) # This code is contributed by ipg2016107
// C# program for// the above approachusing System;using System.Collections.Generic;class GFG{ // Function to find the// maximum value at each// level of N-ary treestatic void maxAtLevel(int N, int M,                       int []Value,                       int [,]Edges){  // Stores the adjacency list  List<int> []adj = new List<int>[N];   for (int i = 0; i < adj.Length; i++)    adj[i] = new List<int>();   // Create the adjacency list  for (int i = 0; i < M; i++)  {    int u = Edges[i, 0];    int v = Edges[i, 1];    adj[u].Add(v);  }   // Perform level order traversal  // of nodes at each level  Queue<int> q = new Queue<int>();   // Push the root node  q.Enqueue(0);   // Iterate until queue is empty  while (q.Count != 0)  {    // Get the size of queue    int count = q.Count;     int maxVal = 0;     // Iterate for all the nodes    // in the queue currently    while (count-- > 0)    {      // Dequeue an node from queue      int temp = q.Peek();      q.Dequeue();       maxVal = Math.Max(maxVal,                        Value[temp]);       // Enqueue the children of      // dequeued node      for (int i = 0;               i < adj[temp].Count; i++)      {        q.Enqueue(adj[temp][i]);      }    }     // Print the result    Console.Write(maxVal + " ");  }} // Driver Codepublic static void Main(String[] args){  // Number of nodes  int N = 10;   // Edges of the N-ary tree  int [,]Edges = {{0, 1}, {0, 2},                  {0, 3}, {1, 4},                  {1, 5}, {3, 6},                  {6, 7}, {6, 8},                  {6, 9}};   // Given cost  int []Value = {1, 2, -1, 3, 4,                 5, 8, 6, 12, 7};   // Function Call  maxAtLevel(N, N - 1, Value, Edges);}} // This code is contributed by 29AjayKumar
<script> // Javascript program for the above approach // Function to find the maximum value// at each level of N-ary treefunction maxAtLevel(N, M, Value, Edges){         // Stores the adjacency list    let adj = new Array(N);         for(let i = 0; i < adj.length; i++)        adj[i] = [];         // Create the adjacency list    for(let i = 0; i < M; i++)    {        let u = Edges[i][0];        let v = Edges[i][1];        adj[u].push(v);    }         // Perform level order traversal    // of nodes at each level    let q = [];         // Push the root node    q.push(0);         // Iterate until queue is empty    while (q.length > 0)    {                 // Get the size of queue        let count = q.length;                 let maxVal = 0;                 // Iterate for all the nodes        // in the queue currently        while (count-- > 0)        {                         // Dequeue an node from queue            let temp = q[0];            q.shift();                         maxVal = Math.max(maxVal, Value[temp]);                         // Enqueue the children of            // dequeued node            for(let i = 0; i < adj[temp].length; i++)            {                q.push(adj[temp][i]);            }        }                 // Print the result        document.write(maxVal + " ");    }} // Driver code // Number of nodeslet N = 10; // Edges of the N-ary treelet Edges = [ [ 0, 1 ], [ 0, 2 ],              [ 0, 3 ], [ 1, 4 ],              [ 1, 5 ], [ 3, 6 ],              [ 6, 7 ], [ 6, 8 ],              [ 6, 9 ] ]; // Given costlet Value = [ 1, 2, -1, 3, 4,              5, 8, 6, 12, 7 ]; // Function CallmaxAtLevel(N, N - 1, Value, Edges); // This code is contributed by suresh07 </script>
1 3 8 12
 
Time Complexity: O(N)Auxiliary Space: O(N)
29AjayKumar
ipg2016107
suresh07
BFS
n-ary-tree
Tree Traversals
tree-level-order
Searching
Tree
Searching
Tree
BFS
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Given an array of size n and a number k, find all elements that appear more than n/k times
Program to find largest element in an array
k largest(or smallest) elements in an array
Search an element in a sorted and rotated array
Median of two sorted arrays of different sizes
Tree Traversals (Inorder, Preorder and Postorder)
Binary Tree | Set 1 (Introduction)
AVL Tree | Set 1 (Insertion)
Level Order Binary Tree Traversal
Inorder Tree Traversal without Recursion