Oppgave 2a)
private void dybdeFørstPost(Node p, Consumer<String> oppgave) { p.besøkt = true; for (Node q : p.kanter) // tar alle kantene fra p { if (!q.besøkt) dybdeFørstPost(q, oppgave); // rekursivt kall } oppgave.accept(p.navn); // postoppgave - accept() er eneste metode i Consumer } public void dybdeFørstPosttraversering(String startnode, Consumer<String> oppgave) { Node p = noder.get(startnode); if (p == null) throw new IllegalArgumentException(startnode + " er ukjent!"); dybdeFørstPost(p, oppgave); // kaller den rekursive metoden }
Oppgave 2c)
String url = "https://www.cs.hioa.no/~ulfu/appolonius/kap11/1/graf2.txt"; Graf graf = new Graf(url); Deque<String> stakk = new ArrayDeque<>(); graf.dybdeFørstPosttraversering("A", stakk::push); System.out.println(stakk); // Utskrift: [A, C, B, D, F, E, G]
Oppgave 3
Løsningsforslag bør være unødvendig her.
Oppgave 4
String url = "https://www.cs.hioa.no/~ulfu/appolonius/kap11/1/graf2.txt"; Graf graf = new Graf(url); List<String> liste = new ArrayList<>(); graf.dybdeFørstPretraversering("A", liste::add); // eller x -> liste.add(x) System.out.println(liste);
Oppgave 5
Her kan en bruke Programkode
11.1.4 e),
men skifte ut Graf
med MGraf
. Dvs. slik:
String url = "https://www.cs.hioa.no/~ulfu/appolonius/kap11/1/graf2.txt"; MGraf graf = new MGraf(url); StringJoiner sj = new StringJoiner(", ", "[", "]"); graf.dybdeFørstPretraversering("A", sj::add); System.out.println(sj.toString()); // Utskrift: [A, B, D, E, G, F, C]
Oppgave 6
public void dybdeFørstPosttraversering(String startnode, Consumer<String> oppgave) { int is = finn(startnode); // indeks i den sorterte navnetabellen if (is < 0) throw new IllegalArgumentException(startnode + " er ukjent!"); int i = indeks[is]; // indeks i matrisen boolean besøkt[] = new boolean[antall]; // hjelpetabell dybdeFørstPost(i, besøkt, oppgave); // kaller den rekursive metoden } private void // rekursiv hjelpemetode dybdeFørstPost(int i, boolean[] besøkt, Consumer<String> oppgave) { besøkt[i] = true; // noden er besøkt for (int j = 0; j < antall; j++) // kantene til noden { if (graf[i][j] && !besøkt[j]) dybdeFørstPost(j, besøkt, oppgave); // rekursivt kall } oppgave.accept(navn[i]); // oppgaven utføres }
Oppgave 7
public void breddeFørstTraversering(String startnode, Consumer<String> oppgave) { int is = finn(startnode); // indeks i den sorterte navnetabellen if (is < 0) throw new IllegalArgumentException(startnode + " er ukjent!"); int i = indeks[is]; // indeks i den usorterte navnetabellen boolean[] besøkt = new boolean[antall]; // hjelpetabell Queue<Integer> kø = new ArrayDeque<>(); // oppretter en kø besøkt[i] = true; // node i besøkes først kø.offer(i); // legger i i køen while (!kø.isEmpty()) // så lenge køen ikke er tom { i = kø.poll(); // tar ut en node fra køen oppgave.accept(navn[i]); // utfører oppgaven for (int j = 0; j < antall; j++) // nodene det går en kant til { if (graf[i][j] && !besøkt[j]) // denne er ikke besøkt { besøkt[j] = true; // nå er den besøkt kø.offer(j); // legger noden i køen } } } }