Print the nodes with a prime degree in given Prufer sequence of a Tree
Last Updated :
29 Mar, 2023
Given a Prufer sequence of a Tree, the task is to print the nodes with prime-degree in this tree.
Examples:
Input: arr[] = {4, 1, 3, 4}
Output: 1 3 4
Explanation:
The tree is:
2----4----3----1----5
|
6
Hence, the degree of 1, 3 and 4
are 2, 2 and 3 respectively
which are prime.
Input: a[] = {1, 2, 2}
Output: 1 2
Approach:
- Since the length of prufer sequence is N – 2 if N is the number of nodes. Therefore, create an array degree[] of size 2 more than the length of the Prufer sequence.
- Initially, fill the degree array with 1.
- Iterate in the Prufer sequence and increase the frequency in the degree table for every element. This method works because the frequency of a node in the Prufer sequence is one less than the degree in the tree.
- Further, to check if the node degree is prime or not, we will use Sieve Of eratosthenes. Create a sieve which will help us to identify if the degree is prime or not in O(1) time.
- If a node has a prime degree, then print the node number.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void SieveOfEratosthenes(
bool prime[], int p_size)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= p_size; p++) {
if (prime[p]) {
for ( int i = p * 2; i <= p_size;
i += p)
prime[i] = false ;
}
}
}
void PrimeDegreeNodes( int prufer[], int n)
{
int nodes = n + 2;
bool prime[nodes + 1];
memset (prime, true , sizeof (prime));
SieveOfEratosthenes(prime, nodes + 1);
int degree[n + 2 + 1];
for ( int i = 1; i <= nodes; i++)
degree[i] = 1;
for ( int i = 0; i < n; i++)
degree[prufer[i]]++;
for ( int i = 1; i <= nodes; i++) {
if (prime[degree[i]]) {
cout << i << " " ;
}
}
}
int main()
{
int a[] = { 4, 1, 3, 4 };
int n = sizeof (a) / sizeof (a[0]);
PrimeDegreeNodes(a, n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void SieveOfEratosthenes(
boolean prime[], int p_size)
{
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= p_size; p++) {
if (prime[p]) {
for ( int i = p * 2 ; i <= p_size;
i += p)
prime[i] = false ;
}
}
}
static void PrimeDegreeNodes( int prufer[], int n)
{
int nodes = n + 2 ;
boolean []prime = new boolean [nodes + 1 ];
Arrays.fill(prime, true );
SieveOfEratosthenes(prime, nodes + 1 );
int []degree = new int [n + 2 + 1 ];
for ( int i = 1 ; i <= nodes; i++)
degree[i] = 1 ;
for ( int i = 0 ; i < n; i++)
degree[prufer[i]]++;
for ( int i = 1 ; i <= nodes; i++) {
if (prime[degree[i]]) {
System.out.print(i+ " " );
}
}
}
public static void main(String[] args)
{
int a[] = { 4 , 1 , 3 , 4 };
int n = a.length;
PrimeDegreeNodes(a, n);
}
}
|
Python3
def SieveOfEratosthenes(prime, p_size):
prime[ 0 ] = False
prime[ 1 ] = False
p = 2
while (p * p < = p_size):
if (prime[p]):
for i in range (p * 2 , p_size + 1 , p):
prime[i] = False
p + = 1
def PrimeDegreeNodes(prufer, n):
nodes = n + 2
prime = [ True ] * (nodes + 1 )
SieveOfEratosthenes(prime, nodes + 1 )
degree = [ 0 ] * (n + 2 + 1 );
for i in range ( 1 , nodes + 1 ):
degree[i] = 1 ;
for i in range ( 0 , n):
degree[prufer[i]] + = 1
for i in range ( 1 , nodes + 1 ):
if prime[degree[i]]:
print (i, end = ' ' )
if __name__ = = '__main__' :
a = [ 4 , 1 , 3 , 4 ]
n = len (a)
PrimeDegreeNodes(a, n)
|
C#
using System;
class GFG{
static void SieveOfEratosthenes( bool []prime,
int p_size)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= p_size; p++)
{
if (prime[p])
{
for ( int i = p * 2; i <= p_size;
i += p)
prime[i] = false ;
}
}
}
static void PrimeDegreeNodes( int []prufer, int n)
{
int nodes = n + 2;
bool []prime = new bool [nodes + 1];
for ( int i = 0; i < prime.Length; i++)
prime[i] = true ;
SieveOfEratosthenes(prime, nodes + 1);
int []degree = new int [n + 2 + 1];
for ( int i = 1; i <= nodes; i++)
degree[i] = 1;
for ( int i = 0; i < n; i++)
degree[prufer[i]]++;
for ( int i = 1; i <= nodes; i++)
{
if (prime[degree[i]])
{
Console.Write(i + " " );
}
}
}
public static void Main(String[] args)
{
int []a = { 4, 1, 3, 4 };
int n = a.Length;
PrimeDegreeNodes(a, n);
}
}
|
Javascript
<script>
function SieveOfEratosthenes(prime, p_size)
{
prime[0] = false ;
prime[1] = false ;
for (let p = 2; p * p <= p_size; p++) {
if (prime[p]) {
for (let i = p * 2; i <= p_size;
i += p)
prime[i] = false ;
}
}
}
function PrimeDegreeNodes(prufer, n)
{
let nodes = n + 2;
let prime = new Array(nodes + 1);
prime.fill( true );
SieveOfEratosthenes(prime, nodes + 1);
let degree = new Array(n + 2 + 1);
for (let i = 1; i <= nodes; i++)
degree[i] = 1;
for (let i = 0; i < n; i++)
degree[prufer[i]]++;
for (let i = 1; i <= nodes; i++) {
if (prime[degree[i]]) {
document.write(i + " " );
}
}
}
let a = [ 4, 1, 3, 4 ];
let n = a.length
PrimeDegreeNodes(a, n);
</script>
|
Time Complexity: O(n*log(log(n))) + O(n) which is asymptotically equal to O(n*log(log(n))).
Space Complexity: O(n) as arrays has been created to store values.
Share your thoughts in the comments
Please Login to comment...