Ihre gerichteten Graphen-Struktur zu vereinfachen, ist es nicht notwendig für Knoten Links zu ihren Vorfahren zu haben, zurück. Ich würde auch die Node-Klasse in Ihrer DAG-Klasse platzieren. Konzeptionell macht diese Darstellung sowieso mehr Sinn, da in einem gerichteten Graphen, wenn Knoten A mit Knoten B verknüpft ist, kein Pfad von B nach A vorhanden sein muss. Tatsächlich kann kein Pfad in beiden Richtungen existieren, da dies ein Zyklus wäre.
public class DAG {
Node root; // assuming only one root exists
public static class Node{
List<Node> successors;
int value;
}
}
Um den Pfad vom Stamm zu einem bestimmten Knoten zu finden, müssen Sie einen Algorithmus ausführen, um das Diagramm zu durchsuchen. Das bedeutet, dass Sie möglicherweise die anderen Knoten im Diagramm möglicherweise rekursiv besuchen, bis Sie den angegebenen Knoten gefunden haben. Wenn Sie diese Art von Berechnungen zu wiederholen vermeiden wollen, können Sie auch den Pfad speichern aus dem Wurzel zu einem bestimmten Knoten mit etwas wie folgt aus:
class PathMap {
HashMap<DAG.Node, List<DAG.Node> > pathMap;
public List<DAG.Node> getPathFromRoot(DAG.Node n) {
List<DAG.Node> pathFromRoot = pathMap.get(n);
return pathFromRoot;
}
}
Nun kann es zu einem von der Wurzel mehrere verschiedene Pfade sein gegebener Knoten. In diesem Fall möchten Sie möglicherweise einen shortest-path-first algorithm implementieren, um den optimalen Pfad zu finden und zu speichern. Siehe dzone article für Pseudocode.
Werfen Sie einen Blick auf diesen Thread http://stackoverflow.com/questions/144642/tree-directed-acyclic-graph-implementation –