Algunas ideas sobre la búsqueda de amplitud

No es una comprensión, son solo algunos pensamientos. El BFS del árbol es muy simple, y debe estar familiarizado con el camino, es decir, poner el nodo en la cola y poner sus nodos secundarios en él cada vez, sin atravesar el cerebro, porque el árbol es equivalente a Gráfico dirigido, por lo que no es necesario marcar si cada punto ha sido atravesado, porque cada punto debe atravesarse solo una vez, pero hoy encontré el BFS del gráfico. Para ser honesto, el gráfico no ha sido revisado, así que para este tipo de problema, la idea Todavía no está tan claro, esta pregunta se enumera a continuación:

Primero observamos la aplicación de los árboles, pero lentamente descubriremos que estamos buscando una capa a la vez. Ponga tantos puntos como sea posible en la primera capa. La última capa debe cumplir los requisitos, por lo que simulamos La lista de adyacencia y fuera de grado y en grado (esta pregunta no está dirigida, hay una visualización en la pregunta, se convierte en grado), cada vez que se agrega el grado 1 a la cola, BFS es suficiente, la última capa se deja, usando una lista vinculada Para llevar a cabo, por cierto, jdk1.8Hashmap es una matriz, lista vinculada, árbol rojo-negro, si la longitud de la lista vinculada es mayor que 8, se convierte en un árbol rojo-negro, y si el número de árboles rojo-negro es menor que 6, se convierte en una lista vinculada, y el factor de carga es 0.75. Ok, después de revisar, enumere el código:

public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> ans = new ArrayList<>();
        if (n == 1) {
            ans.add(0);
            return ans;
        }
        int[] degree = new int[n];
        List<List<Integer>> map = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            map.add(new ArrayList<>());
        }
        for (int[] edge : edges) {
            degree[edge[0]]++;
            degree[edge[1]]++;
            map.get(edge[0]).add(edge[1]);
            map.get(edge[1]).add(edge[0]);
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (degree[i] == 1) {
                queue.offer(i);
            }
        }
        while (!queue.isEmpty()) {
            ans = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int cur = queue.poll();
                ans.add(cur);
                List<Integer> nexts = map.get(cur);
                for (Integer next : nexts) {
                    degree[next]--;
                    if (degree[next] == 1) {
                        queue.offer(next);
                    }
                }
            }
        }
        return ans;
    }

Dormir

17 artículos originales publicados · Me gusta0 · Visitas 148

Supongo que te gusta

Origin blog.csdn.net/qq_33286699/article/details/105189580
Recomendado
Clasificación