Informatik II Übung 2 Florian Scheidegger florsche@student.ethz.ch Folien mit freundlicher Genehmigung adaptiert von Gábor Sörös und Simon Mayer gabor.soros@inf.ethz.ch, simon.mayer@inf.ethz.ch 7.3.2013 1 1
Inhalt Administratives Nachbesprechung U1 Vorbesprechung U2 Bäume Traversierung Speicherung in Array Informatik II
Abgabe Ordnerstruktur beibehalten u1 u1a1 Mult.java Tests.java Nicht zu viele Dateien abgeben! Nur Source Dateien, d.h. *.java Keine *.class Dateien Keine Versteckte Dateien (beginnen mit.) Keine html-files mit Dokumentation -> Im Code ist okey. Betreff: Info2-U[xx]-G[yy]-[Nachname A]-[Nachname B] wird zu Info2-U01-G01-Mustermann1-Mustermann2 Theorie nur in *.pdf oder *.txt Informatik II
Gruppen 4
Wo liegt der Fehler? Quelle: G02 Informatik II
Wo liegt der Fehler? OK!! Informatik II
Besprechung U1 Genau lesen Geometrische Reihe Bei Abschätzung nur relevante Terme beachten 7
Hinweise U2 1. Wurzelbäume Trennung von Struktur und Darstellung Klammerdarstellung Darstellung in eingerückter Form 2. Rekursives Sortieren Ausgabe von Objekten mittels tostring() Rekursiver Sortieralgorithmus 3. Binärbäume als Arrays Wichtigste Sache: checktree() 8
Bäume - Binärbaum: wenn jeder Knoten höchstens zwei Kindknoten besitzt - Voller Baum: kein Halbblatt existiert - Vollständiger Baum: alle Blätter haben die selbe Tiefe - Entarteter Baum: unbalancierter Baum, enthält nur ein Pfad - Höhe A B E Aufgabe: Umgang mit verschiedenen Darstellungen C D 9
Traversieren von Bäumen Quelle: Wikipedia 10
Durchlaufen von Bäumen... preorder(node) { print(node) if left!= null then preorder(left) if right!= null then preorder(right) } Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken 8, 3, 1, 6, 4, 7, 10, 14, 13 In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken 11
Durchlaufen von Bäumen... inorder(node) { if left!= null then preorder(left) print(node) if right!= null then preorder(right) } Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken 8, 3, 1, 6, 4, 7, 10, 14, 13 In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken 1, 3, 4, 6, 7, 8, 10, 13, 14 Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken 12
Durchlaufen von Bäumen... postorder(node) { if left!= null then preorder(left) if right!= null then preorder(right) print(node) } Pre-Order «Aussen» rumlaufen, Knoten beim «links» vorbeilaufen drucken 8, 3, 1, 6, 4, 7, 10, 14, 13 In-Order «Aussen» rumlaufen, Knoten beim «unten» vorbeilaufen drucken 1, 3, 4, 6, 7, 8, 10, 13, 14 Post-Order «Aussen» rumlaufen, Knoten beim «rechts» vorbeilaufen drucken 1, 4, 7, 6, 3, 13, 14, 10, 8 13
Hinweise U2.A2 Sortieren Konstruktor Array von zufällig generierten Zahlen erzeugen Random Klasse verwenden (package java.util) import java.util.random; //RandomGenerator erzeugen: Random r = new Random(); //Array erzeugen... //1 random number generieren: r.nextint(1000); tostring() (Format in Javadoc vorgegeben) String s = ""; for ( int i=0; i<array.length, i++ ) return s; 14
Hinweise U2.A2 Sortieren recursivesort(int until) Zuerst nachdenken, dann programmieren.. Aufruf aus sort() mit array.length Kernidee der Rekursion: Reduzieren einer Probleminstanz auf eine kleinere Probleminstanz. Gegeben: Liste mit n Elementen Um eine Teilliste mit i Elementen absteigend zu sortieren, brauche ich nur...... die ersten (i 1) Elemente absteigend sortieren... das groesste Element im Rest der Liste suchen... und an die erste Stelle des Restes der Liste setzen Die leere Liste ist selbstverständlich schon sortiert... ;-) 15
[ 5 1 9 2 ] [ 5 1 9 2 ] [ 5 1 9 2 ] [ 5 1 9 2 ] [ 5 1 9 2 ] [ 5 1 9 2 ] [ 5 1 9 2 ] [ 9 1 5 2 ] [ 9 1 5 2 ] [ 9 5 1 2 ] [ 9 5 1 2 ] [ 9 5 2 1 ] [ 9 5 2 1 ] Animation von Simon Mayer recursivesort(4) recursivesort(3) recursivesort(2) recursivesort(1) recursivesort(0) Ist sortiert! 9 <- findlargest(0,3) Swap 5 <- findlargest(1,3) Swap 2 <- findlargest(2,3) Swap Kein swap mehr noetig... àliste absteigend sortiert! 16
Hinweise U2.A3 Binärbaum als Array Binärbäume kann man leicht in einem Array speichern, wenn dieses geeignet interpretiert wird. Die Idee besteht darin: Die Wurzel an Index 0 des Arrays zu setzen und Die beiden direkten Nachfolger von i an den Positionen 2i + 1 und 2i + 2 zu speichern Wie gross ist das Array, welches den Binärbaum speichert? 2Höhe-1 array.length < 2Höhe 17
Hinweise U2.A3 Binärbaum als Array char[] tree = new char[7]; D B A F C E tree[0] = A ; tree[1] = B ; tree[2] = C ; tree[3] = D ; tree[4] = ; tree[5] = F ; tree[6] = E ; 18
Hinweise U2.A3 Binärbaum als Array tostring() Idee: tostring() ruft tostring(int node, String identation)auf z.b. tostring(0, ); checktree() Idee: Wurzel an Index 0 Direkte Nachfolger von i an 2i + 1 und 2i + 2 2Höhe-1 array.length < 2Höhe Prüfen ob das für das übergebene Array erfüllt ist Teste: Jedes Element braucht einen Vater "The root is its own father." Was passiert mit Leeren Knoten? 19
viel Spass! 20