um guia transversal do DFS Graph com 6 exemplos de código Leet

Inicialmente, colocamos o nó raiz na pilha. Enquanto a pilha não está vazia, nós a colocamos e empurramos seu filho direito e esquerdo para dentro da pilha.

Quando colocamos o nó raiz, imediatamente o colocamos em nossa lista de resultados. Assim, o primeiro elemento na lista de resultados é a raiz (daí o nome, Pré-encomenda).

O próximo elemento a ser retirado da pilha será o elemento superior da pilha agora: o filho esquerdo do nó raiz. O processo continua de maneira semelhante até que todo o gráfico tenha sido percorrido e todos os valores dos nós da árvore binária entrem na lista resultante.

145. Transversal de ordem posterior de árvore binária (dificuldade: difícil)

O percurso de pré-encomenda é raiz-esquerda-direitae pós-encomenda é raiz direita-esquerda. Isso significa que o percurso pós-pedido é exatamente o inverso do percurso de pré-pedido.

Portanto, uma solução que pode vir à mente agora é simplesmente reverter a matriz resultante de passagem de pré-encomenda. Mas pense bem – isso custaria O (n) complexidade de tempo para revertê-lo.

Uma solução mais inteligente é copiar e colar o código exato da passagem de pré-ordem, mas coloque o resultado no topo da lista vinculada (índice 0) a cada iteração. Leva um tempo constante para adicionar um elemento ao cabeçalho de uma lista vinculada. Legal certo?

94. Transversal em ordem de árvore binária (Dificuldade: Média)

Nossa abordagem para resolver esse problema é semelhante aos problemas anteriores. Mas aqui, visitaremos tudo no lado esquerdo de um nó, imprimiremos o nó e, em seguida, visitaremos tudo no lado direito do nó.

323. Número de componentes conectados em um gráfico não direcionado
(Dificuldade: Média)

Nossa abordagem aqui é criar uma variável chamada ans que armazena o número de componentes conectados.

Primeiro, inicializaremos todos os vértices como não visitados. Começaremos a partir de um nó e, durante a execução do DFS nesse nó (é claro, usando nosso feitiço), ele marcará todos os nós conectados a ele como visitados. O valor de ans será incrementado em 1.


import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class NumberOfConnectedComponents {
    public static void main(String[] args){
        int[][] edge = {{0,1}, {1,2},{3,4}};
        int n = 5;
        System.out.println(connectedcount(n, edge));

    }

    public static int connectedcount(int n, int[][] edges) {

        boolean[] visited = new boolean[n];
        List[] adj = new List[n];
        for(int i=0; i();
        }

        // create the adjacency list
        for(int[] e: edges){
            int from = e[0];
            int to = e[1];
            adj[from].add(to);
            adj[to].add(from);

        }
        Stack stack = new Stack<>();
        int ans = 0; // ans = count of how many times DFS is carried out

        // this for loop through the entire graph
        for(int i = 0; i < n; i++){
            // if a node is not visited
            if(!visited[i]){
                ans++;
                //push it in the stack
                stack.push(i);

             
                while(!stack.empty()) {

                    int current = stack.peek();
                    stack.pop(); //pop the node
                    visited[current] = true; // mark the node as visited

                    List list1 = adj[current];

        // push the connected components of the current node into stack
                    for (int neighbours:list1) {
                        if (!visited[neighbours]) {
                            stack.push(neighbours);
                        }
                    }
                }

        }
    }
        return ans;
    }
}

200. Number of Islands (Dificuldade: Média)

Isso se enquadra em uma categoria geral de problemas em que precisamos encontrar o número de componentes conectados, mas os detalhes são um pouco aprimorados.

Instintivamente, você pode pensar que, uma vez que encontramos um “1”, iniciamos um novo componente. Fazemos um DFS a partir dessa célula nas quatro direções (cima, baixo, direita, esquerda) e alcançamos todos os 1s conectados a essa célula. Todos esses 1s conectados um ao outro pertencem ao mesmo grupo e, portanto, nosso valor de contagem é incrementado em 1. Marcamos essas células de 1 como visitadas e passamos a contar outros componentes conectados.

547. Círculos de amigos (dificuldade: média)

Isso também segue o mesmo conceito de encontrar o número de componentes conectados. Nesta questão, temos uma matriz NxN, mas apenas N amigos no total. As arestas são dadas diretamente através das células, por isso temos que percorrer uma linha para obter os vizinhos para um “amigo” específico.

Observe que aqui, usamos o mesmo padrão de pilha que nossos problemas anteriores.

Isso é tudo por hoje! Espero que isso tenha ajudado você a entender melhor o DFS e que tenha gostado do tutorial. Por favor, recomende este post se você acha que pode ser útil para outra pessoa!