Oppgave 1
7, 4, 9, 2, 6, 8, 10, 1, 3, 5
13, 8, 17, 4, 11, 15, 19, 2, 6, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9
Oppgave 2
public static <T> BinTre<T> komplettInorden(T[] a) { BinTre<T> tre = new BinTre<>(); if (a.length == 0) return tre; // returnerer et tomt tre tre.antall = a.length; tre.rot = komplett(a.length,1); // kaller metoden som lager treet Stakk<Node<T>> s = new TabellStakk<>(); s.leggInn(null); // legger null på bunnen av stakken int i = 0; // tellevariabel for tabellen Node<T> p = tre.rot; // starter i roten og går til venstre for ( ; p.venstre != null; p = p.venstre) s.leggInn(p); while (p != null) { p.verdi = a[i++]; // legger inn a[i] og øker i if (p.høyre != null) // til venstre i høyre subtre { for (p = p.høyre; p.venstre != null; p = p.venstre) s.leggInn(p); } else p = s.taUt(); // p.høyre == null, henter fra stakken } return tre; } public static void main(String[] args) { Integer[] a = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; BinTre<Integer> tre = BinTre.komplettInorden(a); tre.traverserInorden(new KonsollUtskrift<>()); // Utskrift: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 }
Oppgave 3
Antall noder n | n − k/2 | k − 1 | Venstre subtre |
18 | 10 | 15 | 10 |
19 | 11 | 15 | 11 |
20 | 12 | 15 | 12 |
21 | 13 | 15 | 13 |
22 | 14 | 15 | 14 |
23 | 15 | 15 | 15 |
24 | 16 | 15 | 15 |
25 | 17 | 15 | 15 |
26 | 18 | 15 | 15 |
Oppgave 4
I et komplett binærtre med 20 noder vil rotnodens høyre subtre være perfekt. Hvis treet har 23 noder, vil begge subtrærne være perfekte. Hvis treet har 25 noder, vil venstre subtre være perfekt.
Oppgave 5
private static <T> Node<T> komplett(T[] a, int v, int h) { if (v > h) return null; // tomt intervall int n = h - v + 1; // antallet i intervallet int k = Integer.highestOneBit(n); // stripper n int m = n - (k >> 1); // k >> 1 svarer til k/2 Node<T> venstre, høyre; if (m < k) { m += v; venstre = komplett(a, v, m - 1); // venstre subtre høyre = balansert(a, m + 1, h); // høyre subtre } else { m = k - 1 + v; venstre = balansert(a, v, m - 1); // venstre subtre høyre = komplett(a, m + 1, h); // høyre subtre } return new Node<>(a[m], venstre, høyre); }