Imprime el Node con el grado máximo en la secuencia prufer

Dada una secuencia de Prufer de un Árbol, la tarea es imprimir el Node con el grado máximo en el árbol cuya secuencia de Prufer se da. En caso de que haya muchos Nodes con grado máximo, imprima el Node con el número más pequeño. 
Ejemplos: 
 

Input: a[] = {4, 1, 3, 4} 
Output: 4
The tree is:
2----4----3----1----5
     |
     6 

Input: a[] = {1, 2, 2} 
Output: 2

Un enfoque simple es crear el árbol usando la secuencia de Prufer y luego encontrar el grado de todos los Nodes y luego encontrar el máximo entre ellos.
Enfoque eficiente: cree una array de grado [] de tamaño 2 más que la longitud de la secuencia de Prufer, ya que la longitud de la secuencia de Prufer es N – 2 si N es el número de Nodes. Inicialmente, llene la array de grados con 1 . Iterar en la secuencia de Prufer y aumentar la frecuencia en la tabla de grados para cada elemento. Este método funciona porque la frecuencia de un Node en la secuencia de Prufer es uno menos que el grado en el árbol. Ahora iterar en la array de grados y encontrar el Node con la frecuencia máxima que será nuestra respuesta. 
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the node with
// the maximum degree in the tree
// whose Prufer sequence is given
int findMaxDegreeNode(int prufer[], int n)
{
    int nodes = n + 2;
 
    // Hash-table to mark the
    // degree of every node
    int degree[n + 2 + 1];
 
    // Initially let all the degrees be 1
    for (int i = 1; i <= nodes; i++)
        degree[i] = 1;
 
    // Increase the count of the degree
    for (int i = 0; i < n; i++)
        degree[prufer[i]]++;
 
    int maxDegree = 0;
    int node = 0;
 
    // Find the node with maximum degree
    for (int i = 1; i <= nodes; i++) {
        if (degree[i] > maxDegree) {
            maxDegree = degree[i];
            node = i;
        }
    }
 
    return node;
}
 
// Driver code
int main()
{
    int a[] = { 1, 2, 2 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << findMaxDegreeNode(a, n);
 
    return 0;
}

Java

// Java implementation of the approach
import java.io.*;
 
class GFG
{
         
    // Function to return the node with
    // the maximum degree in the tree
    // whose Prufer sequence is given
    static int findMaxDegreeNode(int prufer[], int n)
    {
        int nodes = n + 2;
     
        // Hash-table to mark the
        // degree of every node
        int []degree = new int[n + 2 + 1];
     
        // Initially let all the degrees be 1
        for (int i = 1; i <= nodes; i++)
            degree[i] = 1;
     
        // Increase the count of the degree
        for (int i = 0; i < n; i++)
            degree[prufer[i]]++;
     
        int maxDegree = 0;
        int node = 0;
     
        // Find the node with maximum degree
        for (int i = 1; i <= nodes; i++)
        {
            if (degree[i] > maxDegree)
            {
                maxDegree = degree[i];
                node = i;
            }
        }
     
        return node;
    }
     
    // Driver code
    public static void main (String[] args)
    {
 
        int []a = { 1, 2, 2 };
        int n = a.length;
        System.out.println(findMaxDegreeNode(a, n));
    }
}
 
// This code is contributed by ajit_00023

Python3

     
# Python implementation of the approach
 
# Function to return the node with
# the maximum degree in the tree
# whose Prufer sequence is given
def findMaxDegreeNode(prufer, n):
    nodes = n + 2;
  
    # Hash-table to mark the
    # degree of every node
    degree = [0]*(n + 2 + 1);
  
    # Initially let all the degrees be 1
    for i in range(1,nodes+1):
        degree[i] = 1;
  
    # Increase the count of the degree
    for i in range(n):
        degree[prufer[i]]+=1;
  
    maxDegree = 0;
    node = 0;
  
    # Find the node with maximum degree
    for i in range(1,nodes+1):
        if (degree[i] > maxDegree):
            maxDegree = degree[i];
            node = i;
 
    return node;
 
  
# Driver code
a = [ 1, 2, 2 ];
n = len(a);
print(findMaxDegreeNode(a, n));
 
# This code has been contributed by 29AjayKumar

C#

// C# implementation of the approach
using System;
 
class GFG
{
     
    // Function to return the node with
    // the maximum degree in the tree
    // whose Prufer sequence is given
    static int findMaxDegreeNode(int []prufer, int n)
    {
        int nodes = n + 2;
     
        // Hash-table to mark the
        // degree of every node
        int []degree = new int[n + 2 + 1];
     
        // Initially let all the degrees be 1
        for (int i = 1; i <= nodes; i++)
            degree[i] = 1;
     
        // Increase the count of the degree
        for (int i = 0; i < n; i++)
            degree[prufer[i]]++;
     
        int maxDegree = 0;
        int node = 0;
     
        // Find the node with maximum degree
        for (int i = 1; i <= nodes; i++)
        {
            if (degree[i] > maxDegree)
            {
                maxDegree = degree[i];
                node = i;
            }
        }
     
        return node;
    }
     
    // Driver code
    static public void Main ()
    {
        int []a = { 1, 2, 2 };
        int n = a.Length;
         
        Console.WriteLine(findMaxDegreeNode(a, n));
    }
}
 
// This code is contributed by AnkitRai01

Javascript

<script>
    // Javascript implementation of the approach
     
    // Function to return the node with
    // the maximum degree in the tree
    // whose Prufer sequence is given
    function findMaxDegreeNode(prufer, n)
    {
        let nodes = n + 2;
       
        // Hash-table to mark the
        // degree of every node
        let degree = new Array(n + 2 + 1);
        degree.fill(0);
       
        // Initially let all the degrees be 1
        for (let i = 1; i <= nodes; i++)
            degree[i] = 1;
       
        // Increase the count of the degree
        for (let i = 0; i < n; i++)
            degree[prufer[i]]++;
       
        let maxDegree = 0;
        let node = 0;
       
        // Find the node with maximum degree
        for (let i = 1; i <= nodes; i++)
        {
            if (degree[i] > maxDegree)
            {
                maxDegree = degree[i];
                node = i;
            }
        }
       
        return node;
    }
     
    let a = [ 1, 2, 2 ];
    let n = a.length;
    document.write(findMaxDegreeNode(a, n));
 
</script>
Producción: 

2

 

Complejidad de tiempo: O (N), ya que estamos usando un bucle para atravesar N veces. Donde N es el número de elementos de la array.

Espacio auxiliar: O(N), ya que estamos usando espacio adicional para la array de grados. Donde N es el número de elementos.

Publicación traducida automáticamente

Artículo escrito por Striver y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *