Løsningsforslag - oppgaver i Avsnitt 11.1.4


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
        }
      }
    }
  }