Random Tree Generator Using Prüfer Sequence with Examples
Last Updated :
10 Jan, 2023
Given an integer N, the task is to generate a random labelled tree of N node with (N - 1) edges without forming cycle.
Note: The output generated below is random which may not match with the output generated by the code.
Examples:
Input: N = 3
Output:
1 3
1 2

Input: N = 5
Output:
3 2
4 3
1 4
1 5
This approach uses the Prüfer Sequence to generate random trees.
What is a Prüfer Sequence?
In combinatorial mathematics, the Prüfer sequence (also Prüfer code or Prüfer numbers) of a labelled tree is a unique sequence associated with the tree. The sequence for a tree on n vertices has length n - 2 and can be generated by a simple iterative algorithm.
If the number of nodes is N then the Prüfer Sequence is of length (N - 2) and each position can have N possible values. So the number of the possible labeled trees with N Nodes is N(N - 2).
How Random Trees are generated using Prüfer Sequence?
Generally, Random Tree Generation with N nodes is done in the following steps:
- Generate a Random Sequence
S = {s1, s2, s3.....sn-2}
where each element of the sequence si ? {1, 2, 3, ... N} where repetition of elements is allowed
- Generate Tree from the generated Prüfer Sequence S:
- Create N nodes with values {1, 2, 3, ... N}
- Find smallest element X such that X ? {1, 2, 3, ... N} and X ? S
- Join Node with value X to the node with value s1
- Delete s1 from S
- Repeat the same process from step 2 with until the Prüfer Sequence is empty.
For Example:
- Number of Nodes = 3
- Then the Prüfer Sequence will be of length (N - 2), as in this case it will be of 1 and the possible values it can have {1, 2, 3}.
- Possible Random Sequences will be {{1}, {2}, {3}}.

Below is the implementation of the above approach.
C++
// C++ Implementation for random
// tree generator using Prufer Sequence
#include<bits/stdc++.h>
using namespace std;
// Prints edges of tree
// represented by give Prufer code
void printTreeEdges(vector<int> prufer, int m)
{
int vertices = m + 2;
vector<int> vertex_set(vertices);
// Initialize the array of vertices
for (int i = 0; i < vertices; i++)
vertex_set[i] = 0;
// Number of occurrences of vertex in code
for (int i = 0; i < vertices - 2; i++)
vertex_set[prufer[i] - 1] += 1;
cout<<("\nThe edge set E(G) is:\n");
int j = 0;
// Find the smallest label not present in
// prufer[].
for (int i = 0; i < vertices - 2; i++)
{
for (j = 0; j < vertices; j++)
{
// If j+1 is not present in prufer set
if (vertex_set[j] == 0)
{
// Remove from Prufer set and print
// pair.
vertex_set[j] = -1;
cout<<"(" << (j + 1) << ", "
<< prufer[i] << ") ";
vertex_set[prufer[i] - 1]--;
break;
}
}
}
j = 0;
// For the last element
for (int i = 0; i < vertices; i++)
{
if (vertex_set[i] == 0 && j == 0)
{
cout << "(" << (i + 1) << ", ";
j++;
}
else if (vertex_set[i] == 0 && j == 1)
cout << (i + 1) << ")\n";
}
}
// generate random numbers in between l an r
int ran(int l, int r)
{
return l + (rand() % (r - l + 1));
}
// Function to Generate Random Tree
void generateRandomTree(int n)
{
int length = n - 2;
vector<int> arr(length);
// Loop to Generate Random Array
for (int i = 0; i < length; i++)
{
arr[i] = ran(0, length + 1) + 1;
}
printTreeEdges(arr, length);
}
// Driver Code
int main()
{
srand(time(0));
int n = 5;
generateRandomTree(n);
return 0;
}
Java
// Java Implementation for random
// tree generator using Prufer Sequence
import java.util.Arrays;
import java.util.Random;
class GFG {
// Prints edges of tree
// represented by give Prufer code
static void printTreeEdges(int prufer[], int m)
{
int vertices = m + 2;
int vertex_set[] = new int[vertices];
// Initialize the array of vertices
for (int i = 0; i < vertices; i++)
vertex_set[i] = 0;
// Number of occurrences of vertex in code
for (int i = 0; i < vertices - 2; i++)
vertex_set[prufer[i] - 1] += 1;
System.out.print("\nThe edge set E(G) is:\n");
int j = 0;
// Find the smallest label not present in
// prufer[].
for (int i = 0; i < vertices - 2; i++) {
for (j = 0; j < vertices; j++) {
// If j+1 is not present in prufer set
if (vertex_set[j] == 0) {
// Remove from Prufer set and print
// pair.
vertex_set[j] = -1;
System.out.print("(" + (j + 1) + ", "
+ prufer[i] + ") ");
vertex_set[prufer[i] - 1]--;
break;
}
}
}
j = 0;
// For the last element
for (int i = 0; i < vertices; i++) {
if (vertex_set[i] == 0 && j == 0) {
System.out.print("(" + (i + 1) + ", ");
j++;
}
else if (vertex_set[i] == 0 && j == 1)
System.out.print((i + 1) + ")\n");
}
}
// Function to Generate Random Tree
static void generateRandomTree(int n)
{
Random rand = new Random();
int length = n - 2;
int[] arr = new int[length];
// Loop to Generate Random Array
for (int i = 0; i < length; i++) {
arr[i] = rand.nextInt(length + 1) + 1;
}
printTreeEdges(arr, length);
}
// Driver Code
public static void main(String[] args)
{
int n = 5;
generateRandomTree(n);
}
}
Python3
import random
def print_tree_edges(prufer, m):
vertices = m + 2
vertex_set = [0] * vertices
# Initialize the array of vertices
for i in range(vertices):
vertex_set[i] = 0
# Number of occurrences of vertex in code
for i in range(vertices - 2):
vertex_set[prufer[i] - 1] += 1
print("\nThe edge set E(G) is:")
j = 0
# Find the smallest label not present in prufer[].
for i in range(vertices - 2):
for j in range(vertices):
# If j+1 is not present in prufer set
if vertex_set[j] == 0:
# Remove from Prufer set and print pair.
vertex_set[j] = -1
print("({}, {})".format(j + 1, prufer[i]), end=" ")
vertex_set[prufer[i] - 1] -= 1
break
j = 0
# For the last element
for i in range(vertices):
if vertex_set[i] == 0 and j == 0:
print("({}, ".format(i + 1), end="")
j += 1
elif vertex_set[i] == 0 and j == 1:
print("{})".format(i + 1))
def generate_random_tree(n):
length = n - 2
arr = [0] * length
# Generate random array
for i in range(length):
arr[i] = random.randint(1, length + 1)
print_tree_edges(arr, length)
# Driver code
n = 5
generate_random_tree(n)
C#
// C# Implementation for random
// tree generator using Prufer Sequence
using System;
class GFG
{
// Prints edges of tree
// represented by give Prufer code
static void printTreeEdges(int []prufer, int m)
{
int vertices = m + 2;
int []vertex_set = new int[vertices];
// Initialize the array of vertices
for (int i = 0; i < vertices; i++)
vertex_set[i] = 0;
// Number of occurrences of vertex in code
for (int i = 0; i < vertices - 2; i++)
vertex_set[prufer[i] - 1] += 1;
Console.Write("\nThe edge set E(G) is:\n");
int j = 0;
// Find the smallest label not present in
// prufer[].
for (int i = 0; i < vertices - 2; i++)
{
for (j = 0; j < vertices; j++)
{
// If j + 1 is not present in prufer set
if (vertex_set[j] == 0)
{
// Remove from Prufer set and print
// pair.
vertex_set[j] = -1;
Console.Write("(" + (j + 1) + ", "
+ prufer[i] + ") ");
vertex_set[prufer[i] - 1]--;
break;
}
}
}
j = 0;
// For the last element
for (int i = 0; i < vertices; i++)
{
if (vertex_set[i] == 0 && j == 0)
{
Console.Write("(" + (i + 1) + ", ");
j++;
}
else if (vertex_set[i] == 0 && j == 1)
Console.Write((i + 1) + ")\n");
}
}
// Function to Generate Random Tree
static void generateRandomTree(int n)
{
Random rand = new Random();
int length = n - 2;
int[] arr = new int[length];
// Loop to Generate Random Array
for (int i = 0; i < length; i++)
{
arr[i] = rand.Next(length + 1) + 1;
}
printTreeEdges(arr, length);
}
// Driver Code
public static void Main(String[] args)
{
int n = 5;
generateRandomTree(n);
}
}
// This code is contributed by 29AjayKumar
JavaScript
<script>
// Javascript Implementation for random
// tree generator using Prufer Sequence
// Prints edges of tree
// represented by give Prufer code
function printTreeEdges(prufer,m)
{
let vertices = m + 2;
let vertex_set = new Array(vertices);
// Initialize the array of vertices
for (let i = 0; i < vertices; i++)
vertex_set[i] = 0;
// Number of occurrences of vertex in code
for (let i = 0; i < vertices - 2; i++)
vertex_set[prufer[i] - 1] += 1;
document.write("<br>The edge set E(G) is:<br>");
let j = 0;
// Find the smallest label not present in
// prufer[].
for (let i = 0; i < vertices - 2; i++) {
for (j = 0; j < vertices; j++) {
// If j+1 is not present in prufer set
if (vertex_set[j] == 0) {
// Remove from Prufer set and print
// pair.
vertex_set[j] = -1;
document.write("(" + (j + 1) + ", "
+ prufer[i] + ") ");
vertex_set[prufer[i] - 1]--;
break;
}
}
}
j = 0;
// For the last element
for (let i = 0; i < vertices; i++) {
if (vertex_set[i] == 0 && j == 0) {
document.write("(" + (i + 1) + ", ");
j++;
}
else if (vertex_set[i] == 0 && j == 1)
document.write((i + 1) + ")<br>");
}
}
// Function to Generate Random Tree
function generateRandomTree(n)
{
let length = n - 2;
let arr = new Array(length);
// Loop to Generate Random Array
for (let i = 0; i < length; i++) {
arr[i] = Math.floor(Math.random()*(length + 1)) + 1;
}
printTreeEdges(arr, length);
}
// Driver Code
let n = 5;
generateRandomTree(n);
// This code is contributed by unknown2108
</script>
Output: The edge set E(G) is:
(2, 4) (4, 3) (3, 1) (1, 5)
Time Complexity: O(N*N)
Auxiliary Space: O(N)
Similar Reads
Random setSeed() method in Java with Examples
The setSeed() method of Random class sets the seed of the random number generator using a single long seed. Syntax: public void setSeed() Parameters: The function accepts a single parameter seed which is the initial seed. Return Value: This method has no return value. Exception: The function does no
2 min read
SecureRandom setSeed() method in Java with Examples
setSeed( byte[] seed ) The setSeed() method of java.security.SecureRandom class is used to reseeds this random object. The given seed supplements, rather than replaces, the existing seed. Thus, repeated calls are guaranteed never to reduce randomness. Syntax: public void setSeed(byte[] seed) Paramet
4 min read
Stream generate() method in Java with examples
Stream generate(Supplier<T> s) returns an infinite sequential unordered stream where each element is generated by the provided Supplier. This is suitable for generating constant streams, streams of random elements, etc. Syntax : static <T> Stream<T> generate(Supplier<T> s) Wh
1 min read
SecureRandom generateSeed() method in Java with Examples
The generateSeed() method of java.security.SecureRandom class is used to return the given number of seed bytes, computed using the seed generation algorithm that this class uses to seed itself. This call may be used to seed other random number generators. Syntax:Â Â public byte[] generateSeed(int num
2 min read
Random next() method in Java with Examples
The next() method of Random class returns the next pseudorandom value from the random number generator's sequence. Syntax: protected int next(int bits) Parameters: The function accepts a single parameter bits which are the random bits. Return Value: This method returns the next pseudorandom number.
1 min read
Select a random number from stream, with O(1) space
Given a stream of numbers, generate a random number from the stream. You are allowed to use only O(1) space and the input is in the form of a stream, so can't store the previously seen numbers. So how do we generate a random number from the whole stream such that the probability of picking any numbe
10 min read
SecureRandom getInstance() method in Java with Examples
getInstance( String algorithm ) The getInstance() method of java.security.SecureRandom class is used to return a SecureRandom object that implements the specified Random Number Generator (RNG) algorithm. This method traverses the list of registered security Providers, starting with the most preferre
10 min read
SecureRandom getSeed() method in Java with Examples
The getSeed() method of java.security.SecureRandom class is used to return the given number of seed bytes, computed using the seed generation algorithm that this class uses to seed itself. This call may be used to seed other random number generators. This method is only included for backward compati
2 min read
Random nextLong() method in Java with Examples
The nextGaussian() method of Random class returns the next pseudorandom, uniformly distributed long value from this random number generator's sequence. Syntax: public long nextLong() Parameters: The function does not accepts any parameter. Return Value: This method returns the next pseudorandom, uni
1 min read
Test Case Generation | Set 2 ( Random Characters, Strings and Arrays of Random Strings)
Set 1 (Random Numbers, Arrays and Matrices) Generating Random Characters CPP // A C++ Program to generate test cases for // random characters #include<bits/stdc++.h> using namespace std; // Define the number of runs for the test data // generated #define RUN 5 // Define the range of the test d
11 min read