Open In App

Print all Co-Prime Levels of a Binary Tree

Improve
Improve
Like Article
Like
Save
Share
Report

Given a Binary Tree, the task is to print all Co-prime levels of this tree. 

Any level of a Binary tree is said to be a Co-prime level, if all nodes of this level are co-prime to each other.

Examples: 

Input: 
                 1
                /  \ 
              15    5
             /     /   \ 
            11    4     15 
                   \    / 
                   2   3  
Output: 
 1
 11 4 15
 2 3
Explanation: 
First, Third and Fourth levels
are co-prime levels.

Input:
                  7
                /  \ 
              21     14 
             /  \      \
            77   16     3 
           / \     \    / 
          2   5    10  11    
                   /
                  23 
Output:
 7
 77 16 3
 23
Explanation: 
First, Third and Fifth levels
are co-prime levels.

Approach: In order to check if a level is Co-Prime level or not, 

  • First, we have to store all prime numbers using the Sieve of Eratosthenes.
  • Then, we have to do level order traversal of the binary tree and have to save all elements of that level into a vector.
  • This vector is used to store the levels of the tree while doing the level order traversal.
  • Then for each level, check whether the elements have a GCD equal to 1 or not. If yes then this level is not Co-Prime, else print all elements of that level.

Below is the implementation of the above approach:

C++




// C++ program for printing Co-prime
// levels of binary Tree
 
#include <bits/stdc++.h>
using namespace std;
 
int N = 1000000;
 
// To store all prime numbers
vector<int> prime;
 
void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..N]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    bool check[N + 1];
    memset(check, true, sizeof(check));
 
    for (int p = 2; p * p <= N; p++) {
 
        // If prime[p] is not changed,
        // then it is a prime
        if (check[p] == true) {
 
            prime.push_back(p);
 
            // Update all multiples of p
            // greater than or equal to
            // the square of it
            // numbers which are multiples of p
            // and are less than p^2
            // are already marked.
            for (int i = p * p; i <= N; i += p)
                check[i] = false;
        }
    }
}
 
// A Tree node
struct Node {
    int key;
    struct Node *left, *right;
};
 
// Utility function to create a new node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
// Function to check whether Level
// is Co-prime or not
bool isLevelCo_Prime(vector<int>& L)
{
 
    int max = 0;
    for (auto x : L) {
        if (max < x)
            max = x;
    }
 
    for (int i = 0;
         i * prime[i] <= max / 2;
         i++) {
 
        int ct = 0;
 
        for (auto x : L) {
            if (x % prime[i] == 0)
                ct++;
        }
 
        // If not co-prime
        if (ct > 1) {
            return false;
        }
    }
 
    return true;
}
 
// Function to print a Co-Prime level
void printCo_PrimeLevels(vector<int>& Lev)
{
    for (auto x : Lev) {
        cout << x << " ";
    }
 
    cout << endl;
}
 
// Utility function to get Co-Prime
// Level of a given Binary tree
void findCo_PrimeLevels(
    struct Node* node,
    struct Node* queue[],
    int index, int size)
{
 
    vector<int> Lev;
    // Run while loop
    while (index < size) {
        int curr_size = size;
 
        // Run inner while loop
        while (index < curr_size) {
            struct Node* temp = queue[index];
 
            Lev.push_back(temp->key);
 
            // Push left child in a queue
            if (temp->left != NULL)
                queue[size++] = temp->left;
 
            // Push right child in a queue
            if (temp->right != NULL)
                queue[size++] = temp->right;
 
            // Increment index
            index++;
        }
 
        // If condition to check, level is
        // prime or not
        if (isLevelCo_Prime(Lev)) {
 
            // Function call to print
            // prime level
            printCo_PrimeLevels(Lev);
        }
        Lev.clear();
    }
}
 
// Function to find total no of nodes
// In a given binary tree
int findSize(struct Node* node)
{
    // Base condition
    if (node == NULL)
        return 0;
 
    return 1
           + findSize(node->left)
           + findSize(node->right);
}
 
// Function to find Co-Prime levels
// In a given binary tree
void printCo_PrimeLevels(struct Node* node)
{
    int t_size = findSize(node);
 
    // Create queue
    struct Node* queue[t_size];
 
    // Push root node in a queue
    queue[0] = node;
 
    // Function call
    findCo_PrimeLevels(node, queue, 0, 1);
}
 
// Driver Code
int main()
{
    /*       10
            /  \
           48   12
               /  \
              18   35
              / \  / \
            21 29  43 16
                      /
                     7
    */
 
    // Create Binary Tree as shown
    Node* root = newNode(10);
    root->left = newNode(48);
    root->right = newNode(12);
 
    root->right->left = newNode(18);
    root->right->right = newNode(35);
 
    root->right->left->left = newNode(21);
    root->right->left->right = newNode(29);
    root->right->right->left = newNode(43);
    root->right->right->right = newNode(16);
    root->right->right->right->left = newNode(7);
 
    // To save all prime numbers
    SieveOfEratosthenes();
 
    // Print Co-Prime Levels
    printCo_PrimeLevels(root);
 
    return 0;
}


Java




// Java program for printing Co-prime
// levels of binary Tree
import java.util.*;
 
class GFG{
  
static int N = 1000000;
  
// To store all prime numbers
static Vector<Integer> prime = new Vector<Integer>();
  
static void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..N]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    boolean []check = new boolean[N + 1];
    Arrays.fill(check, true);
  
    for (int p = 2; p * p <= N; p++) {
  
        // If prime[p] is not changed,
        // then it is a prime
        if (check[p] == true) {
  
            prime.add(p);
  
            // Update all multiples of p
            // greater than or equal to
            // the square of it
            // numbers which are multiples of p
            // and are less than p^2
            // are already marked.
            for (int i = p * p; i <= N; i += p)
                check[i] = false;
        }
    }
}
  
// A Tree node
static class Node {
    int key;
    Node left, right;
};
  
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
  
// Function to check whether Level
// is Co-prime or not
static boolean isLevelCo_Prime(Vector<Integer> L)
{
  
    int max = 0;
    for (int x : L) {
        if (max < x)
            max = x;
    }
  
    for (int i = 0;
         i * prime.get(i) <= max / 2;
         i++) {
  
        int ct = 0;
  
        for (int x : L) {
            if (x % prime.get(i) == 0)
                ct++;
        }
  
        // If not co-prime
        if (ct > 1) {
            return false;
        }
    }
  
    return true;
}
  
// Function to print a Co-Prime level
static void printCo_PrimeLevels(Vector<Integer> Lev)
{
    for (int x : Lev) {
        System.out.print(x+ " ");
    }
  
    System.out.println();
}
  
// Utility function to get Co-Prime
// Level of a given Binary tree
static void findCo_PrimeLevels(
    Node node,
    Node queue[],
    int index, int size)
{
  
    Vector<Integer> Lev = new Vector<Integer>();
    // Run while loop
    while (index < size) {
        int curr_size = size;
  
        // Run inner while loop
        while (index < curr_size) {
            Node temp = queue[index];
  
            Lev.add(temp.key);
  
            // Push left child in a queue
            if (temp.left != null)
                queue[size++] = temp.left;
  
            // Push right child in a queue
            if (temp.right != null)
                queue[size++] = temp.right;
  
            // Increment index
            index++;
        }
  
        // If condition to check, level is
        // prime or not
        if (isLevelCo_Prime(Lev)) {
  
            // Function call to print
            // prime level
            printCo_PrimeLevels(Lev);
        }
        Lev.clear();
    }
}
  
// Function to find total no of nodes
// In a given binary tree
static int findSize(Node node)
{
    // Base condition
    if (node == null)
        return 0;
  
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
  
// Function to find Co-Prime levels
// In a given binary tree
static void printCo_PrimeLevels(Node node)
{
    int t_size = findSize(node);
  
    // Create queue
    Node []queue = new Node[t_size];
  
    // Push root node in a queue
    queue[0] = node;
  
    // Function call
    findCo_PrimeLevels(node, queue, 0, 1);
}
  
// Driver Code
public static void main(String[] args)
{
    /*       10
            /  \
           48   12
               /  \
              18   35
              / \  / \
            21 29  43 16
                      /
                     7
    */
  
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(48);
    root.right = newNode(12);
  
    root.right.left = newNode(18);
    root.right.right = newNode(35);
  
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(29);
    root.right.right.left = newNode(43);
    root.right.right.right = newNode(16);
    root.right.right.right.left = newNode(7);
  
    // To save all prime numbers
    SieveOfEratosthenes();
  
    // Print Co-Prime Levels
    printCo_PrimeLevels(root);
  
}
}
 
// This code is contributed by PrinciRaj1992


Python3




# Python3 program for printing
# Co-prime levels of binary Tree
 
# A Tree node
class Node:
     
    def __init__(self, key):
         
        self.key = key
        self.left = None
        self.right = None
         
# Utility function to create
# a new node
def newNode(key):
     
    temp = Node(key)
    return temp
 
N = 1000000
  
# Vector to store all the
# prime numbers
prime = []
  
# Function to store all the
# prime numbers in an array
def SieveOfEratosthenes():
 
    # Create a boolean array "prime[0..N]"
    # and initialize all the entries in it
    # as true. A value in prime[i]
    # will finally be false if
    # i is Not a prime, else true.
    check = [True for i in range(N + 1)]
     
    p = 2
     
    while(p * p <= N):
         
        # If prime[p] is not changed,
        # then it is a prime
        if (check[p]):
  
            prime.append(p);
  
            # Update all multiples of p
            # greater than or equal to
            # the square of it
            # numbers which are multiples of p
            # and are less than p^2
            # are already marked.
            for i in range(p * p, N + 1, p):
                check[i] = False;
                 
        p += 1          
 
# Function to check whether
# Level is Co-prime or not
def isLevelCo_Prime(L):
   
    max = 0;
     
    for x in L:       
        if (max < x):
            max = x;   
    i = 0
     
    while(i * prime[i] <= max // 2): 
        ct = 0;       
        for x in L:           
            if (x % prime[i] == 0):
                ct += 1
         
        # If not co-prime
        if (ct > 1):
            return False;
         
        i += 1
         
    return True;
 
# Function to print a
# Co-Prime Level
def printCo_PrimeLevels(Lev):
     
    for x in Lev:
        print(x, end = ' ')
     
    print()
  
# Utility function to get Co-Prime
# Level of a given Binary tree
def findCo_PrimeLevels(node, queue,
                       index, size):
   
    Lev = []
     
    # Run while loop
    while (index < size):       
        curr_size = size;
   
        # Run inner while loop
        while (index < curr_size):           
            temp = queue[index]; 
            Lev.append(temp.key)
   
            # Push left child in a
            # queue
            if (temp.left != None):
                queue[size] = temp.left;
                size += 1
   
            # Push right child in a queue
            if (temp.right != None):
                queue[size] = temp.right;
                size += 1
   
            # Increment index
            index += 1       
   
        # If condition to check, level
        # is prime or not
        if (isLevelCo_Prime(Lev)):
   
            # Function call to print
            # prime level
            printCo_PrimeLevels(Lev);
         
        Lev.clear();
     
# Function to find total no of nodes
# In a given binary tree
def findSize(node):
 
    # Base condition
    if (node == None):
        return 0;
   
    return (1 + findSize(node.left) +
                findSize(node.right));
  
# Function to find Co-Prime levels
# In a given binary tree
def printCo_PrimeLevel(node):
 
    t_size = findSize(node);
   
    # Create queue
    queue = [0 for i in range(t_size)]
   
    # Push root node in a queue
    queue[0] = node;
   
    # Function call
    findCo_PrimeLevels(node, queue,
                       0, 1);
     
# Driver code   
if __name__ == "__main__":
     
    '''      10
            /  \
           48   12
               /  \
              18   35
              / \  / \
            21 29  43 16
                      /
                     7
    '''
  
    # Create Binary Tree as shown
    root = newNode(10);
 
    root.left = newNode(48);
    root.right = newNode(12);
  
    root.right.left = newNode(18);
    root.right.right = newNode(35);
  
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(29);
    root.right.right.left = newNode(43);
    root.right.right.right = newNode(16);
    root.right.right.right.left = newNode(7);
     
    # To save all prime numbers
    SieveOfEratosthenes();
  
    # Print Co-Prime Levels
    printCo_PrimeLevel(root);
 
# This code is contributed by Rutvik_56


C#




// C# program for printing Co-prime
// levels of binary Tree
using System;
using System.Collections.Generic;
 
class GFG{
   
static int N = 1000000;
   
// To store all prime numbers
static List<int> prime = new List<int>();
   
static void SieveOfEratosthenes()
{
    // Create a bool array "prime[0..N]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    bool []check = new bool[N + 1];
    for(int i = 0; i <= N; i++)
        check[i] = true;
  
    for (int p = 2; p * p <= N; p++) {
   
        // If prime[p] is not changed,
        // then it is a prime
        if (check[p] == true) {
   
            prime.Add(p);
   
            // Update all multiples of p
            // greater than or equal to
            // the square of it
            // numbers which are multiples of p
            // and are less than p^2
            // are already marked.
            for (int i = p * p; i <= N; i += p)
                check[i] = false;
        }
    }
}
   
// A Tree node
class Node {
    public int key;
    public Node left, right;
};
   
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
   
// Function to check whether Level
// is Co-prime or not
static bool isLevelCo_Prime(List<int> L)
{
   
    int max = 0;
    foreach (int x in L) {
        if (max < x)
            max = x;
    }
   
    for (int i = 0;
         i * prime[i] <= max / 2;
         i++) {
   
        int ct = 0;
   
        foreach (int x in L) {
            if (x % prime[i] == 0)
                ct++;
        }
   
        // If not co-prime
        if (ct > 1) {
            return false;
        }
    }
   
    return true;
}
   
// Function to print a Co-Prime level
static void printCo_PrimeLevels(List<int> Lev)
{
    foreach (int x in Lev) {
        Console.Write(x+ " ");
    }
   
    Console.WriteLine();
}
   
// Utility function to get Co-Prime
// Level of a given Binary tree
static void findCo_PrimeLevels(
    Node node,
    Node []queue,
    int index, int size)
{
   
    List<int> Lev = new List<int>();
    // Run while loop
    while (index < size) {
        int curr_size = size;
   
        // Run inner while loop
        while (index < curr_size) {
            Node temp = queue[index];
   
            Lev.Add(temp.key);
   
            // Push left child in a queue
            if (temp.left != null)
                queue[size++] = temp.left;
   
            // Push right child in a queue
            if (temp.right != null)
                queue[size++] = temp.right;
   
            // Increment index
            index++;
        }
   
        // If condition to check, level is
        // prime or not
        if (isLevelCo_Prime(Lev)) {
   
            // Function call to print
            // prime level
            printCo_PrimeLevels(Lev);
        }
        Lev.Clear();
    }
}
   
// Function to find total no of nodes
// In a given binary tree
static int findSize(Node node)
{
    // Base condition
    if (node == null)
        return 0;
   
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
   
// Function to find Co-Prime levels
// In a given binary tree
static void printCo_PrimeLevels(Node node)
{
    int t_size = findSize(node);
   
    // Create queue
    Node []queue = new Node[t_size];
   
    // Push root node in a queue
    queue[0] = node;
   
    // Function call
    findCo_PrimeLevels(node, queue, 0, 1);
}
   
// Driver Code
public static void Main(String[] args)
{
    /*       10
            /  \
           48   12
               /  \
              18   35
              / \  / \
            21 29  43 16
                      /
                     7
    */
   
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(48);
    root.right = newNode(12);
   
    root.right.left = newNode(18);
    root.right.right = newNode(35);
   
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(29);
    root.right.right.left = newNode(43);
    root.right.right.right = newNode(16);
    root.right.right.right.left = newNode(7);
   
    // To save all prime numbers
    SieveOfEratosthenes();
   
    // Print Co-Prime Levels
    printCo_PrimeLevels(root);
   
}
}
 
// This code is contributed by Rajput-Ji


Javascript




<script>
 
// Javascript program for printing Co-prime
// levels of binary Tree
let N = 1000000;
 
// To store all prime numbers
let prime = [];
 
function SieveOfEratosthenes()
{
     
    // Create a boolean array "prime[0..N]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    let check = new Array(N + 1);
    check.fill(true);
 
    for(let p = 2; p * p <= N; p++)
    {
         
        // If prime[p] is not changed,
        // then it is a prime
        if (check[p] == true)
        {
            prime.push(p);
             
            // Update all multiples of p
            // greater than or equal to
            // the square of it
            // numbers which are multiples of p
            // and are less than p^2
            // are already marked.
            for(let i = p * p; i <= N; i += p)
                check[i] = false;
        }
    }
}
 
// A Tree node
class Node
{
    constructor(key)
    {
        this.left = null;
        this.right = null;
        this.key = key;
    }
}
 
// Utility function to create a new node
function newNode(key)
{
    let temp = new Node(key);
    return (temp);
}
 
// Function to check whether Level
// is Co-prime or not
function isLevelCo_Prime(L)
{
    let max = 0;
     
    for(let x = 0; x < L.length; x++)
    {
        if (max < L[x])
            max = L[x];
    }
 
    for(let i = 0;
            i * prime[i] <= parseInt(max / 2, 10);
            i++)
    {
        let ct = 0;
 
        for(let x = 0; x < L.length; x++)
        {
            if (L[x] % prime[i] == 0)
                ct++;
        }
 
        // If not co-prime
        if (ct > 1)
        {
            return false;
        }
    }
    return true;
}
 
// Function to print a Co-Prime level
function printCoPrimeLevels(Lev)
{
    for(let x = 0; x < Lev.length; x++)
    {
        document.write(Lev[x] + " ");
    }
 
    document.write("</br>");
}
 
// Utility function to get Co-Prime
// Level of a given Binary tree
function findCo_PrimeLevels(node, queue, index, size)
{
    let Lev = [];
     
    // Run while loop
    while (index < size)
    {
        let curr_size = size;
 
        // Run inner while loop
        while (index < curr_size)
        {
            let temp = queue[index];
            Lev.push(temp.key);
 
            // Push left child in a queue
            if (temp.left != null)
                queue[size++] = temp.left;
 
            // Push right child in a queue
            if (temp.right != null)
                queue[size++] = temp.right;
 
            // Increment index
            index++;
        }
 
        // If condition to check, level is
        // prime or not
        if (isLevelCo_Prime(Lev))
        {
             
            // Function call to print
            // prime level
            printCoPrimeLevels(Lev);
        }
        Lev = [];
    }
}
 
// Function to find total no of nodes
// In a given binary tree
function findSize(node)
{
     
    // Base condition
    if (node == null)
        return 0;
 
    return 1 + findSize(node.left) +
               findSize(node.right);
}
 
// Function to find Co-Prime levels
// In a given binary tree
function printCo_PrimeLevels(node)
{
    let t_size = findSize(node);
     
    // Create queue
    let queue = new Array(t_size);
    for(let i = 0; i < t_size; i++)
    {
        queue[i] = new Node();
    }
 
    // Push root node in a queue
    queue[0] = node;
 
    // Function call
    findCo_PrimeLevels(node, queue, 0, 1);
}
 
// Driver code
/*       10
        /  \
       48   12
           /  \
          18   35
          / \  / \
        21 29  43 16
                  /
                 7
*/
 
// Create Binary Tree as shown
let root = newNode(10);
root.left = newNode(48);
root.right = newNode(12);
 
root.right.left = newNode(18);
root.right.right = newNode(35);
 
root.right.left.left = newNode(21);
root.right.left.right = newNode(29);
root.right.right.left = newNode(43);
root.right.right.right = newNode(16);
root.right.right.right.left = newNode(7);
 
// To save all prime numbers
SieveOfEratosthenes();
 
// Print Co-Prime Levels
printCo_PrimeLevels(root);
 
// This code is contributed by mukesh07  
 
</script>


Output: 

10 
18 35 
21 29 43 16 
7

 



Last Updated : 28 Jun, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads