Encuentra todos los caminos en un árbol representado como un grafo, desde cualquier nodo a cualquier otro nodo. (Solo en dirección hacia abajo)
Dado los bordes
Bordes: {{1,2},
{1,3},
{3,4},
{3,5},
{5,6}};
Encuentra todos los posibles caminos desde cualquier nodo hasta cualquier nodo (Nota: solo se mueve hacia abajo desde el nodo raíz).
Salida esperada:
1->2
1->3
1->3->4
1->3->5
1->3->5->6
3->4
3->5
5->6
3->5->6
He escrito el código para esto. Pero solo puedo obtener: 1->2, 1->3, 3->4, 3->5, 5->6.
Código: https://leetcode.com/playground/bEp484tr
static void dfs(int source){
Stack
HashSet
int currVertex;
String path = “”;
stack.push(source);
visited.add(source);
while(!stack.isEmpty()){
currVertex = stack.pop().intValue();
path += currVertex;
if(!adjList.containsKey(currVertex)){
continue;
}
// Visiting its neighbours
for(int neighbour : adjList.get(new Integer(currVertex))){
if(!visited.contains(new Integer(neighbour))){
path += neighbour;
visited.add(neighbour);
stack.push(neighbour);
System.out.println(path);
// Undo
path = path.substring(0, path.length() - 1);
}
}
path = "";
}
}
¿Podría ayudarme a entender dónde me equivoqué, por qué solo se imprime la salida de dos dígitos?
Además, ¿cómo manejo el caso para 3->5->6? Este es el caso en el que el nodo padre no es el nodo raíz.
davy.ai
El código que ha escrito solo puede recorrer el gráfico de manera descendente desde el nodo raíz, lo que significa que solo recorrerá hacia abajo el gráfico. Para obtener todos los caminos desde cualquier nodo hasta cualquier otro nodo, debes recorrer el gráfico de manera ascendente y en horizontal.
En el recorrido en horizontal y vertical, debes hacer un seguimiento del camino desde el nodo raíz hasta el nodo actual. Esto se puede hacer usando una cola en lugar de una pila y haciendo un seguimiento del camino en una cadena.
Por ejemplo, cuando visitas el nodo 3, puedes agregar el camino
1->3
a la cola. Cuando visitas el nodo 4, puedes agregar el camino1->3->4
a la cola. De esta manera, puedes hacer un seguimiento del camino desde el nodo raíz hasta el nodo actual.Una vez que tengas el camino desde el nodo raíz hasta el nodo actual, puedes imprimir el camino desde cualquier nodo hasta cualquier otro nodo. Por ejemplo, para el camino
1->3->5->6
, puedes imprimir el camino desde el nodo 3 hasta el nodo 6 como3->5->6
.Puedes encontrar una implementación de ejemplo del recorrido en horizontal y vertical aquí.