Categorías
Algorithms

LeetCode – Árboles de altura mínima (Java)

Para un gráfico no dirigido con características de árbol, podemos elegir cualquier nodo como raíz. El gráfico de resultado es entonces un árbol enraizado. Entre todos los árboles enraizados posibles, los que tienen una altura mínima se denominan árboles de altura mínima (MHT). Dado un gráfico de este tipo, escriba una función para encontrar todos los MHT y devuelva una lista de sus etiquetas raíz.

El gráfico contiene n nodos que están etiquetados de 0 a n – 1. Se le dará el número n y una lista de bordes no dirigidos (cada borde es un par de etiquetas).

Puede suponer que no aparecerán bordes duplicados en los bordes. Dado que todos los bordes no están dirigidos, [0, 1] es lo mismo que [1, 0] y por lo tanto no aparecerán juntos en los bordes.

Ejemplo 1:

Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]

        0
        |
        1
       / 
      2   3
return [1]

Solución Java

public List<Integer> findMinHeightTrees(int n, int[][] edges) {
    List<Integer> result = new ArrayList<Integer>();
    if(n==0){
        return result;
    }
    if(n==1){
        result.add(0);
        return result;
    }
 
    ArrayList<HashSet<Integer>> graph = new ArrayList<HashSet<Integer>>();
    for(int i=0; i<n; i++){
        graph.add(new HashSet<Integer>());
    }
 
    for(int[] edge: edges){
        graph.get(edge[0]).add(edge[1]);
        graph.get(edge[1]).add(edge[0]);
    }
 
    LinkedList<Integer> leaves = new LinkedList<Integer>();
    for(int i=0; i<n; i++){
        if(graph.get(i).size()==1){
            leaves.offer(i);
        }
    }
 
    if(leaves.size()==0){
        return result;
    }
 
    while(n>2){
        n = n-leaves.size();
 
        LinkedList<Integer> newLeaves = new LinkedList<Integer>();
 
        for(int l: leaves){
            int neighbor = graph.get(l).iterator().next();
            graph.get(neighbor).remove(l);
            if(graph.get(neighbor).size()==1){
                newLeaves.add(neighbor);
            }
        }
 
        leaves = newLeaves;
    }
 
    return leaves;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

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