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