Sei
- Statt in die Breite zu gehen, wird so tief wie möglich in den Graphen gegangen.
- Dabei wird ein möglichst langer Pfad vom Startknoten aufgebaut.
- Der Pfadaufbau endet, wenn keine Nachfolger mehr zu finden sind oder bereits alle Nachfolger besucht wurden.
- Tiefensuche erlaubt einen eleganten, rekursiven Algorithmus
- Jeder Knoten bekommt zwei Zeitstempel:
firsttime- Knoten wurde zum ersten mal gesehen - graulasttime- Adjazenzliste des Knotens ist verarbeitet - schwarz
Implementierung
JavaScript
function dfs(graph, node, visited = new Set()) {
if (visited.has(node)) {
return; // Wenn der Knoten bereits besucht wurde, kehre zurück
}
visited.add(node); // Markiere den Knoten als besucht "grau"
console.log(node); // Bearbeite den Knoten (hier einfach Ausgabe)
// Rekursiver Aufruf für alle Nachbarn des Knotens
graph[node].forEach(neighbor => {
dfs(graph, neighbor, visited);
});
// Adjazenzliste ist abgearbeitet, "schwarz"
}Komplexität
- Aufwand für die Initialisierung:
- Für einen Knoten wird maximal einmal
dfsaufgerufen, d.h. es gibtviele Aufrufe der Funktion - Innerhalb von
dfswird jede Adjazenzliste maximal einmal durchlaufen, insgesamt gibt esEinträge in allen Listen - Insgesamt ergibt sich: