0
Zu deiner Implementierung kann ich ein paar Dinge sagen:
- Verwende keine HashMap, sondern ein HashSet zum Speichern der schon besuchten Knoten, da du sonst redundant immer "true" als Value speicherst, was unnötig ist.
- Wenn du die Implementierung mit dem Stack wählst, dann musst du entweder innerhalb der for-Schleife den Befehl zum pushen auf den Stack NACH der if-Anweisung stellen oder schreiben:
Vertex current = pathStack.pop();Das liegt daran, weil du ja den "sink"-Vertex am Ende noch auf den Stack pusht, bevor du die while-Schleife abbrichst. Ich würde dir tatsächlich von der Methode mit dem Stack abraten, auch wenn sie vielleicht unter Umständen funktioniert. Das liegt daran, dass jeder Knoten mehrere Eltern haben kann, d. h. die Abfrage isParent(...) wäre nicht eindeutig. Was du aber machen könntest, wäre für jeden Knoten einfach eine Vorgängerreferenz zu speichern, d. h. in der Implementierung von Vertex einfach ein weiteres Attribut einfügen:
private Vertex prev;Innerhalb der for-Schleife, bei der du alle Kinder des Knotens durchläufst, schreibst du dann einfach:
child.prev = current;Am Ende kannst du dann einfach rekursiv vom Zielknoten bis zum Startknoten durchlaufen, indem du einfach immer den Vorgängerknoten aufrufst, dessen Referenz ja in "prev" gespeichert ist.
Diese Antwort melden
Link
geantwortet
daniel.kuenkel
Schüler, Punkte: 455
Schüler, Punkte: 455