Høgskolen i Østfold Avdeling for informasjonsteknologi Løsningsforslag til ny/utsatt eksamen i ITF20006 Algoritmer og datastrukturer 05.01.2018 Oppgave 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 b d b b a d d b d c c a b a c d d d a b Oppgave 2 a) public void addfirst(int value) // Sett inn først i kø head = new node(value, head); numnodes++; public int removefirst() // Ta ut først i kø if (numnodes!= 0) int v = head.value; head = head.next; // Feil, forsøk på fjerning fra tom kø // Håndterer ikke feilen på noen fornuftig måte b) public void addlast(int value) // Sett inn sist i kø if (numnodes == 0) head = new node(value, null); node p = head; while (p.next!= null) p = p.next; p.next = new node(value, null); numnodes++;
public int removelast() // Ta ut sist i kø if (numnodes == 1) int v = head.value; head = null; if (numnodes!= 0) node p = head; while (p.next.next!= null) p = p.next; int v = p.next.value; p.next = null; // Feil, forsøk på fjerning fra tom kø // Håndterer ikke feilen på noen fornuftig måte Oppgave 3 a) b)
c) d) Oppgave 4 a) Her holder det med bare å legge inn en if test som stopper whileløkken som går nedover i treet, med en gang vi finner ut at verdien som skal legges inn finnes fra før: public boolean insert(int value) node p = root, q = null; int cmp = 0; q = p; cmp = value p.value; // Oppgave 4 a): Stopper hvis verdi finnes fra før if (cmp == 0) return false; p = cmp < 0? p.left : p.right; p = new node(value);
if (empty()) root = p; if (cmp < 0) q.left = p; q.right = p; n++; return true; b) Dette blir relativt likt første del av insert metoden ovenfor. Vi trenger bare å bruke en ekstra variabel D som holder rede på dybden etterhvert som vi søker nedover i treet, og så terminere og returnere verdien av D når den søkte verdien finnes. I løsningen nedenfor er det litt mer kode enn det som oppgaven egentlig ber om. Det er først laget en public metode som finner dybden til en verdi i hele treet. Denne metoden kaller en privat metode som finner dybden til en verdi i et subtre med en gitt rot. Denne private metoden skal senere brukes i løsningen av oppgave 4 c). public int depth(int value) return depth(value, root); private int depth(int value, node p) int cmp = 0, D = 0; cmp = value p.value; if (cmp == 0) return D; p = cmp < 0? p.left : p.right; D++; c) Denne oppgaven kan løses på mange måter, men uansett teknikk må vi finne den nærmeste felles forgjengeren til noden til v1 og noden til v2. En måte kunne være å legge alle nodene på veien nedover (til v1 og til v2) inn i en kø og så sammenligne de to køene. En annen måte er å søke og stoppe der veien skiller seg. Vi velger den siste måten i løsningen nedenfor, med bruk av den private metoden depth fra oppgave 4 b). Merk at hvis de to nodene ligger på samme gren i treet, definerer vi den noden som ligger lengst opp (nærmest roten) som nærmeste felles forgjenger.
public int distance(int v1, int v2) // Bytter evt. om verdiene slik at v1 alltid vil være mindre // eller lik v2 if (v1 > v2) int tmp = v2; v2 = v1; v1 = tmp; // Finner nærmeste felles forgjenger node p = root; if (v2 < p.value ) // v1 og v2 ligger til venstre p = p.left; if (v1 > p.value) // v1 og v2 ligger til høyre p = p.right; break; // Veien deler seg i p if (p == null) // Ingen av verdiene finnes i treet // Finner dybden til hver node i subtreet med rot i nærmeste // forgjenger int D1 = depth(v1, p), D2 = depth(v2, p); if (D1 == 1 D2 == 1) // En av verdiene finnes ikke // Avstanden er summen av avstandene til nærmeste forgjenger return D1 + D2;