Euler tour of tree has been already discussed which flattens the hierarchical structure of tree into array which contains exactly 2*N-1 values. In this post, the task is to prove that the degree of Euler Tour Tree is 2 times the number of nodes minus one. Here degree means the total number of nodes get traversed in Euler Tour.
Examples:
Input:
Output: 15
Input:
Output: 17
Explanation:
Using Example 1:
where
It can be seen that each node’s count in Euler Tour is exactly equal to the out-degree of node plus 1.
Mathematically, it can be represented as:
Where,
Total represents total number of nodes in Euler Tour Tree node_i represents ith node in given Tree @N represents the total number of node in given Tree@Out_D_e_g[node_i] represents number of child of node_i
Implementation:
// C++ program to check the number of nodes // in Euler Tour tree. #include <bits/stdc++.h> using namespace std;
#define MAX 1001 // Adjacency list representation of tree vector< int > adj[MAX];
// Function to add edges to tree void add_edge( int u, int v)
{ adj[u].push_back(v);
} // Program to check if calculated Value is // equal to 2*size-1 void checkTotalNumberofNodes( int actualAnswer,
int size)
{ int calculatedAnswer = size;
// Add out-degree of each node
for ( int i = 1; i <= size; i++)
calculatedAnswer += adj[i].size();
if (actualAnswer == calculatedAnswer)
cout << "Calculated Answer is " << calculatedAnswer
<< " and is Equal to Actual Answer\n" ;
else
cout << "Calculated Answer is Incorrect\n" ;
} int main()
{ // Constructing 1st tree from example
int N = 8;
add_edge(1, 2);
add_edge(1, 3);
add_edge(2, 4);
add_edge(2, 5);
add_edge(3, 6);
add_edge(3, 7);
add_edge(6, 8);
// Out_deg[node[i]] is equal to adj[i].size()
checkTotalNumberofNodes(2 * N - 1, N);
// clear previous stored tree
for ( int i = 1; i <= N; i++)
adj[i].clear();
// Constructing 2nd tree from example
N = 9;
add_edge(1, 2);
add_edge(1, 3);
add_edge(2, 4);
add_edge(2, 5);
add_edge(2, 6);
add_edge(3, 9);
add_edge(5, 7);
add_edge(5, 8);
// Out_deg[node[i]] is equal to adj[i].size()
checkTotalNumberofNodes(2 * N - 1, N);
return 0;
} |
// Java program to check the number of nodes // in Euler Tour tree. import java.util.*;
class GFG
{ static final int MAX = 1001 ;
// Adjacency list representation of tree
static Vector<Integer>[] adj = new Vector[MAX];
// Function to add edges to tree
static void add_edge( int u, int v)
{
adj[u].add(v);
}
// Program to check if calculated Value is
// equal to 2*size-1
static void checkTotalNumberofNodes( int actualAnswer,
int size)
{
int calculatedAnswer = size;
// Add out-degree of each node
for ( int i = 1 ; i <= size; i++)
calculatedAnswer += adj[i].size();
if (actualAnswer == calculatedAnswer)
System.out.print( "Calculated Answer is " +
calculatedAnswer +
" and is Equal to Actual Answer\n" );
else
System.out.print( "Calculated Answer is Incorrect\n" );
}
// Driver Code
public static void main(String[] args)
{
for ( int i = 0 ; i < MAX; i++)
adj[i] = new Vector<Integer>();
// Constructing 1st tree from example
int N = 8 ;
add_edge( 1 , 2 );
add_edge( 1 , 3 );
add_edge( 2 , 4 );
add_edge( 2 , 5 );
add_edge( 3 , 6 );
add_edge( 3 , 7 );
add_edge( 6 , 8 );
// Out_deg[node[i]] is equal to adj[i].size()
checkTotalNumberofNodes( 2 * N - 1 , N);
// clear previous stored tree
for ( int i = 1 ; i <= N; i++)
adj[i].clear();
// Constructing 2nd tree from example
N = 9 ;
add_edge( 1 , 2 );
add_edge( 1 , 3 );
add_edge( 2 , 4 );
add_edge( 2 , 5 );
add_edge( 2 , 6 );
add_edge( 3 , 9 );
add_edge( 5 , 7 );
add_edge( 5 , 8 );
// Out_deg[node[i]] is equal to adj[i].size()
checkTotalNumberofNodes( 2 * N - 1 , N);
}
} // This code is contributed by Rajput-Ji |
# Python3 program to check the number # of nodes in Euler Tour tree. MAX = 1001 ;
# Adjacency list representation of tree adj = [ list () for _ in range ( MAX )]
# Function to add edges to tree def add_edge(u, v):
l1 = adj[u]
l1.append(v)
adj[u] = l1;
# Program to check if calculated Value is # equal to 2*size-1 def checkTotalNumberofNodes(actualAnswer, size) :
calculatedAnswer = size;
# push out-degree of each node
for i in range ( 1 , size + 1 ):
calculatedAnswer + = len (adj[i]);
if (actualAnswer = = calculatedAnswer):
print ( "Calculated Answer is" , calculatedAnswer, "and is Equal to Actual Answer" )
else :
print ( "Calculated Answer is Incorrect" );
# Driver Code # Constructing 1st tree from example N = 8 ;
add_edge( 1 , 2 );
add_edge( 1 , 3 );
add_edge( 2 , 4 );
add_edge( 2 , 5 );
add_edge( 3 , 6 );
add_edge( 3 , 7 );
add_edge( 6 , 8 );
# Out_deg[node[i]] is equal to adj[i].Count checkTotalNumberofNodes( 2 * N - 1 , N);
# clear previous stored tree for i in range (N + 1 ):
adj[i] = []
# Constructing 2nd tree from example N = 9 ;
add_edge( 1 , 2 );
add_edge( 1 , 3 );
add_edge( 2 , 4 );
add_edge( 2 , 5 );
add_edge( 2 , 6 );
add_edge( 3 , 9 );
add_edge( 5 , 7 );
add_edge( 5 , 8 );
# Out_deg[node[i]] is equal to adj[i].Count checkTotalNumberofNodes( 2 * N - 1 , N);
# This code is contributed by phasing17 |
// C# program to check the number // of nodes in Euler Tour tree. using System;
using System.Collections.Generic;
class GFG
{ static readonly int MAX = 1001;
// Adjacency list representation of tree
static List< int >[] adj = new List< int >[MAX];
// Function to add edges to tree
static void add_edge( int u, int v)
{
adj[u].Add(v);
}
// Program to check if calculated Value is
// equal to 2*size-1
static void checkTotalNumberofNodes( int actualAnswer,
int size)
{
int calculatedAnswer = size;
// Add out-degree of each node
for ( int i = 1; i <= size; i++)
calculatedAnswer += adj[i].Count;
if (actualAnswer == calculatedAnswer)
Console.Write( "Calculated Answer is " +
calculatedAnswer +
" and is Equal to Actual Answer\n" );
else
Console.Write( "Calculated Answer " +
"is Incorrect\n" );
}
// Driver Code
public static void Main(String[] args)
{
for ( int i = 0; i < MAX; i++)
adj[i] = new List< int >();
// Constructing 1st tree from example
int N = 8;
add_edge(1, 2);
add_edge(1, 3);
add_edge(2, 4);
add_edge(2, 5);
add_edge(3, 6);
add_edge(3, 7);
add_edge(6, 8);
// Out_deg[node[i]] is equal to adj[i].Count
checkTotalNumberofNodes(2 * N - 1, N);
// clear previous stored tree
for ( int i = 1; i <= N; i++)
adj[i].Clear();
// Constructing 2nd tree from example
N = 9;
add_edge(1, 2);
add_edge(1, 3);
add_edge(2, 4);
add_edge(2, 5);
add_edge(2, 6);
add_edge(3, 9);
add_edge(5, 7);
add_edge(5, 8);
// Out_deg[node[i]] is equal to adj[i].Count
checkTotalNumberofNodes(2 * N - 1, N);
}
} // This code is contributed by PrinciRaj1992 |
<script> // Javascript program to check the number // of nodes in Euler Tour tree. var MAX = 1001;
// Adjacency list representation of tree var adj = Array.from(Array(MAX), ()=>Array());
// Function to add edges to tree function add_edge(u, v)
{ adj[u].push(v);
} // Program to check if calculated Value is // equal to 2*size-1 function checkTotalNumberofNodes(actualAnswer, size)
{ var calculatedAnswer = size;
// push out-degree of each node
for ( var i = 1; i <= size; i++)
calculatedAnswer += adj[i].length;
if (actualAnswer == calculatedAnswer)
document.write( "Calculated Answer is " +
calculatedAnswer +
" and is Equal to Actual Answer<br>" );
else
document.write( "Calculated Answer " +
"is Incorrect<br>" );
} // Driver Code for ( var i = 0; i < MAX; i++)
adj[i] = [];
// Constructing 1st tree from example var N = 8;
add_edge(1, 2); add_edge(1, 3); add_edge(2, 4); add_edge(2, 5); add_edge(3, 6); add_edge(3, 7); add_edge(6, 8); // Out_deg[node[i]] is equal to adj[i].Count checkTotalNumberofNodes(2 * N - 1, N); // clear previous stored tree for ( var i = 1; i <= N; i++)
adj[i] = []
// Constructing 2nd tree from example N = 9; add_edge(1, 2); add_edge(1, 3); add_edge(2, 4); add_edge(2, 5); add_edge(2, 6); add_edge(3, 9); add_edge(5, 7); add_edge(5, 8); // Out_deg[node[i]] is equal to adj[i].Count checkTotalNumberofNodes(2 * N - 1, N); // This code is contributed by itsok. </script> |
Output
Calculated Answer is 15 and is Equal to Actual Answer Calculated Answer is 17 and is Equal to Actual Answer
Time complexity: O(N)
Auxiliary space: O(MAX)