Total nodes traversed in Euler Tour Tree

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:
 $\displaystyle Total=\sum_{node_i=1}^{N} Out_D_e_g[node_i]+1$

 $\displaystyle Total= N + \sum_{node_i=1}^{N} Out_D_e_g[node_i]$

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

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output:

Calculated Answer is 15 and is Equal to Actual Answer
Calculated Answer is 17 and is Equal to Actual Answer

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Rajput-Ji, princiraj1992