Open In App

Print levels with odd number of nodes and even number of nodes

Improve
Improve
Like Article
Like
Save
Share
Report

Given an N-ary tree, print all the levels with odd and even numbers of nodes in it. 

Examples

For example consider the following tree
          1               - Level 1
       /     \
      2       3           - Level 2
    /   \       \
   4     5       6        - Level 3
        /  \     /
       7    8   9         - Level 4

The levels with odd number of nodes are: 1 3 4 
The levels with even number of nodes are: 2

Note: The level numbers starts from 1. That is, the root node is at the level 1.

Approach

  • Insert all the connecting nodes to a 2-D vector tree.
  • Run a DFS on the tree such that height[node] = 1 + height[parent]
  • Once DFS traversal is completed, increase the count[] array by 1, for every node’s level.
  • Iterate from first level to last level, and print all nodes with count[] values as odd to get level with odd number nodes.
  • Iterate from first level to last level, and print all nodes with count[] values as even to get level with even number nodes.

Below is the implementation of the above approach:

C++




// C++ program to print all levels
// with odd and even number of nodes
 
#include <bits/stdc++.h>
using namespace std;
 
// Function for DFS in a tree
void dfs(int node, int parent, int height[], int vis[],
         vector<int> tree[])
{
    // calculate the level of every node
    height[node] = 1 + height[parent];
 
    // mark every node as visited
    vis[node] = 1;
 
    // iterate in the subtree
    for (auto it : tree[node]) {
 
        // if the node is not visited
        if (!vis[it]) {
 
            // call the dfs function
            dfs(it, node, height, vis, tree);
        }
    }
}
 
// Function to insert edges
void insertEdges(int x, int y, vector<int> tree[])
{
    tree[x].push_back(y);
    tree[y].push_back(x);
}
 
// Function to print all levels
void printLevelsOddEven(int N, int vis[], int height[])
{
    int mark[N + 1];
    memset(mark, 0, sizeof mark);
 
    int maxLevel = 0;
    for (int i = 1; i <= N; i++) {
 
        // count number of nodes
        // in every level
        if (vis[i])
            mark[height[i]]++;
 
        // find the maximum height of tree
        maxLevel = max(height[i], maxLevel);
    }
 
    // print odd number of nodes
    cout << "The levels with odd number of nodes are: ";
    for (int i = 1; i <= maxLevel; i++) {
        if (mark[i] % 2)
            cout << i << " ";
    }
 
    // print even number of nodes
    cout << "\nThe levels with even number of nodes are: ";
    for (int i = 1; i <= maxLevel; i++) {
        if (mark[i] % 2 == 0)
            cout << i << " ";
    }
}
 
// Driver Code
int main()
{
    // Construct the tree
 
    /*   1
       /   \
      2     3
     / \     \
    4    5    6
        / \  /
       7   8 9  */
 
    const int N = 9;
 
    vector<int> tree[N + 1];
 
    insertEdges(1, 2, tree);
    insertEdges(1, 3, tree);
    insertEdges(2, 4, tree);
    insertEdges(2, 5, tree);
    insertEdges(5, 7, tree);
    insertEdges(5, 8, tree);
    insertEdges(3, 6, tree);
    insertEdges(6, 9, tree);
 
    int height[N + 1];
    int vis[N + 1] = { 0 };
 
    height[0] = 0;
 
    // call the dfs function
    dfs(1, 0, height, vis, tree);
 
    // Function to print
    printLevelsOddEven(N, vis, height);
 
    return 0;
}


Java




// Java program to print all levels
// with odd and even number of nodes
import java.util.*;
 
@SuppressWarnings("unchecked")
class GFG{
  
// Function for DFS in a tree
static void dfs(int node, int parent,
                int []height, int []vis,
                ArrayList []tree)
{
     
    // Calculate the level of every node
    height[node] = 1 + height[parent];
   
    // Mark every node as visited
    vis[node] = 1;
   
    // Iterate in the subtree
    for(int it : (ArrayList<Integer>)tree[node])
    {
         
        // If the node is not visited
        if (vis[it] == 0)
        {
             
            // Call the dfs function
            dfs(it, node, height, vis, tree);
        }
    }
}
   
// Function to insert edges
static void insertEdges(int x, int y,
                        ArrayList []tree)
{
    tree[x].add(y);
    tree[y].add(x);
}
   
// Function to print all levels
static void printLevelsOddEven(int N, int []vis,
                               int []height)
{
    int []mark = new int[N + 1];
    Arrays.fill(mark, 0);
    int maxLevel = 0;
     
    for(int i = 1; i <= N; i++)
    {
         
        // Count number of nodes
        // in every level
        if (vis[i] != 0)
            mark[height[i]]++;
   
        // Find the maximum height of tree
        maxLevel = Math.max(height[i], maxLevel);
    }
   
    // Print odd number of nodes
    System.out.print("The levels with odd " +
                     "number of nodes are: ");
      
    for(int i = 1; i <= maxLevel; i++)
    {
        if (mark[i] % 2 != 0)
        {
            System.out.print(i + " ");
        }
    }
   
    // Print even number of nodes
    System.out.print("\nThe levels with even " +
                     "number of nodes are: ");
      
    for(int i = 1; i <= maxLevel; i++)
    {
        if (mark[i] % 2 == 0)
        {
            System.out.print(i + " ");
        }
    }
}
      
// Driver code 
public static void main(String []s)
{
     
    // Construct the tree
      
    /*   1
       /   \
      2     3
     / \     \
    4    5    6
        / \  /
       7   8 9  */
      
    int N = 9;
      
    ArrayList []tree = new ArrayList[N + 1];
      
    for(int i = 0; i < N + 1; i++)
    {
        tree[i] = new ArrayList();
    }
      
    insertEdges(1, 2, tree);
    insertEdges(1, 3, tree);
    insertEdges(2, 4, tree);
    insertEdges(2, 5, tree);
    insertEdges(5, 7, tree);
    insertEdges(5, 8, tree);
    insertEdges(3, 6, tree);
    insertEdges(6, 9, tree);
      
    int []height = new int[N + 1];
    int []vis = new int[N + 1];
    Arrays.fill(vis, 0);
      
    height[0] = 0;
      
    // Call the dfs function
    dfs(1, 0, height, vis, tree);
      
    // Function to print
    printLevelsOddEven(N, vis, height);
}
}
 
// This code is contributed by pratham76


Python3




# Python3 program to print all levels
# with odd and even number of nodes
 
# Function for DFS in a tree
def dfs(node, parent, height, vis, tree):
 
    # calculate the level of every node
    height[node] = 1 + height[parent]
 
    # mark every node as visited
    vis[node] = 1
 
    # iterate in the subtree
    for it in tree[node]:
 
        # if the node is not visited
        if not vis[it]:
 
            # call the dfs function
            dfs(it, node, height, vis, tree)
         
# Function to insert edges
def insertEdges(x, y, tree):
 
    tree[x].append(y)
    tree[y].append(x)
 
# Function to print all levels
def printLevelsOddEven(N, vis, height):
 
    mark = [0] * (N + 1)
     
    maxLevel = 0
    for i in range(1, N + 1):
 
        # count number of nodes in every level
        if vis[i]:
            mark[height[i]] += 1
 
        # find the maximum height of tree
        maxLevel = max(height[i], maxLevel)
     
    # print odd number of nodes
    print("The levels with odd number",
          "of nodes are: ", end = "")
    for i in range(1, maxLevel + 1):
        if mark[i] % 2:
            print(i, end = " ")
     
    # print even number of nodes
    print("\nThe levels with even number",
          "of nodes are: ", end = "")
    for i in range(1, maxLevel + 1):
        if mark[i] % 2 == 0:
            print(i, end = " ")
 
# Driver Code
if __name__ == "__main__":
 
    # Construct the tree
    N = 9
    tree = [[] for i in range(N + 1)]
 
    insertEdges(1, 2, tree)
    insertEdges(1, 3, tree)
    insertEdges(2, 4, tree)
    insertEdges(2, 5, tree)
    insertEdges(5, 7, tree)
    insertEdges(5, 8, tree)
    insertEdges(3, 6, tree)
    insertEdges(6, 9, tree)
 
    height = [0] * (N + 1)
    vis = [0] * (N + 1)
 
    # call the dfs function
    dfs(1, 0, height, vis, tree)
 
    # Function to print
    printLevelsOddEven(N, vis, height)
 
# This code is contributed by Rituraj Jain


C#




// C# program to print all levels
// with odd and even number of nodes
using System;
using System.Collections;
 
class GFG{
 
// Function for DFS in a tree
static void dfs(int node, int parent,
                int []height, int []vis,
                ArrayList []tree)
{
     
    // Calculate the level of every node
    height[node] = 1 + height[parent];
  
    // Mark every node as visited
    vis[node] = 1;
  
    // Iterate in the subtree
    foreach (int it in tree[node])
    {
         
        // If the node is not visited
        if (vis[it] == 0)
        {
             
            // Call the dfs function
            dfs(it, node, height, vis, tree);
        }
    }
}
  
// Function to insert edges
static void insertEdges(int x, int y,
                        ArrayList []tree)
{
    tree[x].Add(y);
    tree[y].Add(x);
}
  
// Function to print all levels
static void printLevelsOddEven(int N, int []vis,
                               int []height)
{
    int []mark = new int[N + 1];
    Array.Fill(mark, 0);
  
    int maxLevel = 0;
    for(int i = 1; i <= N; i++)
    {
         
        // Count number of nodes
        // in every level
        if (vis[i] != 0)
            mark[height[i]]++;
  
        // Find the maximum height of tree
        maxLevel = Math.Max(height[i], maxLevel);
    }
  
    // Print odd number of nodes
    Console.Write("The levels with odd " +
                  "number of nodes are: ");
     
    for(int i = 1; i <= maxLevel; i++)
    {
        if (mark[i] % 2 != 0)
        {
            Console.Write(i + " ");
        }
    }
  
    // Print even number of nodes
    Console.Write("\nThe levels with even " +
                  "number of nodes are: ");
     
    for(int i = 1; i <= maxLevel; i++)
    {
        if (mark[i] % 2 == 0)
        {
            Console.Write(i + " ");
        }
    }
}
     
// Driver code 
static void Main()
{
       
    // Construct the tree
     
    /*   1
       /   \
      2     3
     / \     \
    4    5    6
        / \  /
       7   8 9  */
     
    int N = 9;
     
    ArrayList []tree = new ArrayList[N + 1];
     
    for(int i = 0; i < N + 1; i++)
    {
        tree[i] = new ArrayList();
    }
     
    insertEdges(1, 2, tree);
    insertEdges(1, 3, tree);
    insertEdges(2, 4, tree);
    insertEdges(2, 5, tree);
    insertEdges(5, 7, tree);
    insertEdges(5, 8, tree);
    insertEdges(3, 6, tree);
    insertEdges(6, 9, tree);
     
    int []height = new int[N + 1];
    int []vis = new int[N + 1];
    Array.Fill(vis, 0);
     
    height[0] = 0;
     
    // Call the dfs function
    dfs(1, 0, height, vis, tree);
     
    // Function to print
    printLevelsOddEven(N, vis, height);
}
}
 
// This code is contributed by rutvik_56


Javascript




<script>
 
    // JavaScript program to print all levels
    // with odd and even number of nodes
     
    // Function for DFS in a tree
    function dfs(node, parent, height, vis, tree)
    {
 
        // Calculate the level of every node
        height[node] = 1 + height[parent];
 
        // Mark every node as visited
        vis[node] = 1;
 
        // Iterate in the subtree
        for(let it = 0; it < tree[node].length; it++)
        {
 
            // If the node is not visited
            if (vis[tree[node][it]] == 0)
            {
 
                // Call the dfs function
                dfs(tree[node][it], node, height, vis, tree);
            }
        }
    }
 
    // Function to insert edges
    function insertEdges(x, y, tree)
    {
        tree[x].push(y);
        tree[y].push(x);
    }
 
    // Function to print all levels
    function printLevelsOddEven(N, vis, height)
    {
        let mark = new Array(N + 1);
        mark.fill(0);
        let maxLevel = 0;
 
        for(let i = 1; i <= N; i++)
        {
 
            // Count number of nodes
            // in every level
            if (vis[i] != 0)
                mark[height[i]]++;
 
            // Find the maximum height of tree
            maxLevel = Math.max(height[i], maxLevel);
        }
 
        // Print odd number of nodes
        document.write("The levels with odd " +
                         "number of nodes are: ");
 
        for(let i = 1; i <= maxLevel; i++)
        {
            if (mark[i] % 2 != 0)
            {
                document.write(i + " ");
            }
        }
 
        // Print even number of nodes
        document.write("</br>" + "The levels with even " +
                         "number of nodes are: ");
 
        for(let i = 1; i <= maxLevel; i++)
        {
            if (mark[i] % 2 == 0)
            {
                document.write(i + " ");
            }
        }
    }
     
    // Construct the tree
       
    /*   1
       /   \
      2     3
     / \     \
    4    5    6
        / \  /
       7   8 9  */
       
    let N = 9;
       
    let tree = new Array(N + 1);
       
    for(let i = 0; i < N + 1; i++)
    {
        tree[i] = [];
    }
       
    insertEdges(1, 2, tree);
    insertEdges(1, 3, tree);
    insertEdges(2, 4, tree);
    insertEdges(2, 5, tree);
    insertEdges(5, 7, tree);
    insertEdges(5, 8, tree);
    insertEdges(3, 6, tree);
    insertEdges(6, 9, tree);
       
    let height = new Array(N + 1);
    let vis = new Array(N + 1);
    vis.fill(0);
       
    height[0] = 0;
       
    // Call the dfs function
    dfs(1, 0, height, vis, tree);
       
    // Function to print
    printLevelsOddEven(N, vis, height);
 
</script>


Output

The levels with odd number of nodes are: 1 3 4 
The levels with even number of nodes are: 2 

Complexity Analysis:

  • Time Complexity: O(N) 
  • Auxiliary Space: O(N)


Last Updated : 09 Sep, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads