package graph; import java.util.ArrayList; public class Graph { private ArrayList nodes = new ArrayList<>(); public ArrayList getNodes() { return nodes; } public Node getFirstNode() { return nodes.get(0); } public void addNode(Node n) { if (nodes.contains(n)) { throw new IllegalArgumentException(); } nodes.add(n); } public ArrayList depthFirst(Node startNode) { unmarkAllNodes(); final ArrayList collect = new ArrayList<>(); search(startNode, collect); return collect; } private void search(Node node, ArrayList collect) { if (node.getMarked()) return; node.setMarked(true); collect.add(node); for (Edge e : node.getOut()) search(e.getTarget(), collect); } public ArrayList breadthFirst(Node startNode) { unmarkAllNodes(); final ArrayList collect = new ArrayList<>(); startNode.setMarked(true); collect.add(startNode); // Die folgende For-Schleife kann nicht als foreach-loop // realisiert werden, weil sich collect laufend ändert for (int i = 0; i < collect.size(); i++) for (Edge edge : collect.get(i).getOut()) { final Node target = edge.getTarget(); if (!target.getMarked()) { target.setMarked(true); collect.add(target); } } return collect; } private void unmarkAllNodes() { for (Node n : nodes) n.setMarked(false); } @Override public String toString() { StringBuilder str = new StringBuilder(); str.append("Grap=\n"); for (Node n : nodes) { str.append(n).append(";\n"); } return str.toString(); } }