Given a binary tree, our task is to print the nodes whose height is a prime number starting from the root node.
Examples:
Input: 1 / \ 2 3 / \ 4 5 Output: 4 5 Explanation: For this tree: Height of Node 1 - 0, Height of Node 2 - 1, Height of Node 3 - 1, Height of Node 4 - 2, Height of Node 5 - 2. Hence, the nodes whose height is a prime number are 4, and 5. Input: 1 / \ 2 5 / \ 3 4 Output: 3 4 Explanation: For this tree: Height of Node 1 - 0, Height of Node 2 - 1, Height of Node 3 - 2, Height of Node 4 - 2, Height of Node 5 - 1. Hence, the nodes whose height is a prime number are 3, and 4.
Approach: To solve the problem mentioned above,
- We have to perform Depth First Search(DFS) on the tree and for every node, store the height of every node as we move down the tree.
- Iterate over the height array of each node and check if it prime or not.
- If yes then print the node else ignore it.
Below is the implementation of the above approach:
C++
// C++ implementation of nodes // at prime height in the given tree Â
#include <bits/stdc++.h> using namespace std; Â
#define MAX 100000 Â
vector< int > graph[MAX + 1]; Â
// To store Prime Numbers vector< bool > Prime(MAX + 1, true ); Â
// To store height of each node int height[MAX + 1]; Â
// Function to find the // prime numbers till 10^5 void SieveOfEratosthenes() { Â
    int i, j;     Prime[0] = Prime[1] = false ;     for (i = 2; i * i <= MAX; i++) { Â
        // Traverse all multiple of i         // and make it false         if (Prime[i]) { Â
            for (j = 2 * i; j < MAX; j += i) {                 Prime[j] = false ;             }         }     } } Â
// Function to perform dfs void dfs( int node, int parent, int h) {     // Store the height of node     height[node] = h; Â
    for ( int to : graph[node]) {         if (to == parent)             continue ;         dfs(to, node, h + 1);     } } Â
// Function to find the nodes // at prime height void primeHeightNode( int N) { Â Â Â Â // To precompute prime number till 10^5 Â Â Â Â SieveOfEratosthenes(); Â
    for ( int i = 1; i <= N; i++) {         // Check if height[node] is prime         if (Prime[height[i]]) {             cout << i << " " ;         }     } } Â
// Driver code int main() {     // Number of nodes     int N = 5; Â
    // Edges of the tree     graph[1].push_back(2);     graph[1].push_back(3);     graph[2].push_back(4);     graph[2].push_back(5); Â
    dfs(1, 1, 0); Â
    primeHeightNode(N); Â
    return 0; } |
Java
// Java implementation of nodes // at prime height in the given tree import java.util.*; Â
class GFG{      static final int MAX = 100000 ;      @SuppressWarnings ( "unchecked" ) static Vector<Integer> []graph = new Vector[MAX + 1 ];      // To store Prime Numbers static boolean []Prime = new boolean [MAX + 1 ];      // To store height of each node static int []height = new int [MAX + 1 ];      // Function to find the // prime numbers till 10^5 static void SieveOfEratosthenes() {     int i, j;          Prime[ 0 ] = Prime[ 1 ] = false ;     for (i = 2 ; i * i <= MAX; i++)     {                  // Traverse all multiple of i         // and make it false         if (Prime[i])         {                          for (j = 2 * i; j < MAX; j += i)             {                 Prime[j] = false ;             }         }     } }      // Function to perform dfs static void dfs( int node, int parent, int h) {          // Store the height of node     height[node] = h;          for ( int to : graph[node])     {         if (to == parent)             continue ;                      dfs(to, node, h + 1 );     } }      // Function to find the nodes // at prime height static void primeHeightNode( int N) {          // To precompute prime number till 10^5     SieveOfEratosthenes();          for ( int i = 1 ; i <= N; i++)     {                  // Check if height[node] is prime         if (Prime[height[i]])         {             System.out.print(i + " " );         }     } }      // Driver code public static void main(String[] args) {          // Number of nodes     int N = 5 ;     for ( int i = 0 ; i < Prime.length; i++)         Prime[i] = true ;              for ( int i = 0 ; i < graph.length; i++)         graph[i] = new Vector<Integer>();              // Edges of the tree     graph[ 1 ].add( 2 );     graph[ 1 ].add( 3 );     graph[ 2 ].add( 4 );     graph[ 2 ].add( 5 );          dfs( 1 , 1 , 0 );          primeHeightNode(N); } } Â
// This code is contributed by 29AjayKumar |
Python3
# Python3 implementation of nodes # at prime height in the given tree MAX = 100000 Â
graph = [[] for i in range ( MAX + 1 )] Â
# To store Prime Numbers Prime = [ True for i in range ( MAX + 1 )] Â
# To store height of each node height = [ 0 for i in range ( MAX + 1 )] Â
# Function to find the # prime numbers till 10^5 def SieveOfEratosthenes():          Prime[ 0 ] = Prime[ 1 ] = False     i = 2          while i * i < = MAX : Â
        # Traverse all multiple of i         # and make it false         if (Prime[i]):             for j in range ( 2 * i, MAX , i):                 Prime[j] = False                  i + = 1 Â
# Function to perform dfs def dfs(node, parent, h): Â
    # Store the height of node     height[node] = h          for to in  graph[node]:         if (to = = parent):             continue                  dfs(to, node, h + 1 )      # Function to find the nodes # at prime height def primeHeightNode(N): Â
    # To precompute prime     # number till 10^5     SieveOfEratosthenes()          for i in range ( 1 , N + 1 ):                  # Check if height[node] is prime         if (Prime[height[i]]):             print (i, end = ' ' ) Â
# Driver code if __name__ = = "__main__" : Â
    # Number of nodes     N = 5          # Edges of the tree     graph[ 1 ].append( 2 )     graph[ 1 ].append( 3 )     graph[ 2 ].append( 4 )     graph[ 2 ].append( 5 ) Â
    dfs( 1 , 1 , 0 ) Â
    primeHeightNode(N) Â
# This code is contributed by rutvik_56 |
C#
// C# implementation of nodes // at prime height in the given tree using System; using System.Collections.Generic; class GFG{ Â Â Â Â static readonly int MAX = 100000; Â Â Â Â static List< int >[] graph = new List< int >[ MAX + 1 ]; Â
    // To store Prime Numbers     static bool [] Prime = new bool [MAX + 1]; Â
    // To store height of each node     static int [] height = new int [MAX + 1]; Â
    // Function to find the     // prime numbers till 10^5     static void SieveOfEratosthenes()     {         int i, j;         Prime[0] = Prime[1] = false ;         for (i = 2; i * i <= MAX; i++)         { Â
            // Traverse all multiple of i             // and make it false             if (Prime[i])             {                 for (j = 2 * i; j < MAX; j += i)                 {                     Prime[j] = false ;                 }             }         }     } Â
    // Function to perform dfs     static void dfs( int node, int parent, int h)     { Â
        // Store the height of node         height[node] = h; Â
        foreach ( int to in graph[node])         {             if (to == parent)                 continue ;             dfs(to, node, h + 1);         }     } Â
    // Function to find the nodes     // at prime height     static void primeHeightNode( int N)     { Â
        // To precompute prime number till 10^5         SieveOfEratosthenes(); Â
        for ( int i = 1; i <= N; i++)         { Â
            // Check if height[node] is prime             if (Prime[height[i]])             {                 Console.Write(i + " " );             }         }     } Â
    // Driver code     public static void Main(String[] args)     { Â
        // Number of nodes         int N = 5;         for ( int i = 0; i < Prime.Length; i++)             Prime[i] = true ; Â
        for ( int i = 0; i < graph.Length; i++)             graph[i] = new List< int >(); Â
        // Edges of the tree         graph[1].Add(2);         graph[1].Add(3);         graph[2].Add(4);         graph[2].Add(5); Â
        dfs(1, 1, 0);         primeHeightNode(N);     } } Â
// This code is contributed by Amit Katiyar |
Javascript
<script> // Javascript implementation of nodes // at prime height in the given tree Â
let MAX = 100000; Â
let graph = [] Â
for (let i = 0; i < MAX + 1; i++){ Â Â Â Â graph.push([]) } Â
// To store Prime Numbers let Prime = new Array(MAX + 1).fill( true ); Â
// To store height of each node let height = new Array(MAX + 1); Â
// Function to find the // prime numbers till 10^5 function SieveOfEratosthenes() { Â
    let i, j;     Prime[0] = Prime[1] = false ;     for (i = 2; i * i <= MAX; i++) { Â
        // Traverse all multiple of i         // and make it false         if (Prime[i]) { Â
            for (j = 2 * i; j < MAX; j += i) {                 Prime[j] = false ;             }         }     } } Â
// Function to perform dfs function dfs(node, parent, h) {     // Store the height of node     height[node] = h; Â
    for (let to of graph[node]) {         if (to == parent)             continue ;         dfs(to, node, h + 1);     } } Â
// Function to find the nodes // at prime height function primeHeightNode(N) { Â Â Â Â // To precompute prime number till 10^5 Â Â Â Â SieveOfEratosthenes(); Â
    for (let i = 1; i <= N; i++) {         // Check if height[node] is prime         if (Prime[height[i]]) {             document.write(i + " " );         }     } } Â
// Driver code     // Number of nodes     let N = 5; Â
    // Edges of the tree     graph[1].push(2);     graph[1].push(3);     graph[2].push(4);     graph[2].push(5); Â
    dfs(1, 1, 0); Â
    primeHeightNode(N); Â
// This code is contributed by gfgking </script> |
4 5
Â
Time Complexity: O(N+MAX*log(log(MAX)))
Auxiliary Space: O(MAX)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!