Stunden-Protokoll für den 21.03.2011 Als allererstes haben wir das UML-Diagramm des Binärbaumes besprochen und sind zu folgendem Ergebnis gekommen: Man sieht zwischen den Klassen nur Assoziationen, da keine Vererbung auftritt und keine Klasse aus einer anderen besteht. Anschließend haben wir besprochen, wie die einfuege- und finde-Operation aussieht. Meine Lösung dazu: Im Binärbaum: public void einfuegen (int v) { if(wurzel==null){ // Sollte der Baum leer sein wird ein neuer Knoten // erstellt und zur Wurzel gemacht wurzel=new Knoten(v); laenge++; return; } // Andernfalls wird der Wurzel das Einfügen übergeben wurzel.einfuegen(v); laenge++; } Im Knoten: public void einfuegen(int v){ //Ist der neue Wert größer/gleich des eigenen Werts if(value<=v){ if(right==null){ //Und der rechte Teilbaum leer //So wird ein neuer Knoten erstellt Knoten newK=new Knoten(v); right=newK; //und zum rechten TB gemacht return; }else{ //Ist der rechte TB vorhanden, wird ihm das //Einfügen befohlen right.einfuegen(v); } // Ist der neue Wert kleiner des eigenen Werts }else{ if(left==null){ //Und der linke Teilbaum leer //So wird ein neuer Knoten erstellt Knoten newK=new Knoten(v); left=newK; //und zum linken TB gemacht return; }else{ //Ist der rechte TB vorhanden, wird ihm das //Einfügen befohlen left.einfuegen(v); } } } Die Einfüge-Operation ist fast dieselbe. Mann muss nur an den Stellen, an denen ein neuer Knoten erstellt wird, return false schreiben und an den Stellen, an denen einfuegen der Teilbäume ausgeführt wird, return teilbaum.finden(v) schreiben. Dann haben wir uns den Syntax für inorder überlegt: existiert linker Nachfolger? Ja: liefere links.inorder Nein: erstelle Array mit 0 Elementen existiert rechter Nachfolger? Ja: liefere rechts.inorder Nein: erstelle Array mit 0 Elementen Neues Array Länge= arrayL + 1 + arrayR Als Quellcode sieht es dann so aus: Im Binärbaum: public int[] inorder(){ if(wurzel==null){ int n[]=new int[0]; return n; } //Ansonsten die Ausgabe return wurzel.inorder(); } //Falls der Baum leer ist //Array mit 0 Elementen erstellen // Und zurückgeben der Wurzel zurückgeben Im Knoten: public int[] inorder(){ int index=0; //Index der nächsten freien Stelle im Array int l[]; if(left==null){ //Falls der linke Teilbaum leer ist l=new int[0]; //Einen Array mit 0 Elementen erstellen }else{ //Ansonsten die Reihenfolge des linken TB speichern l=left.inorder(); } int r[]; //Das gleiche wird mit dem rechtem TB wiederholt if(right==null){ r=new int[0]; }else{ r=right.inorder(); } //Ein neues Array erstellen int n[]=new int[l.length+1+r.length]; //Und alle Elemente der linken Reihenfolge for(int i=0; i<l.length; i++){ n[index]=l[i];//In den neuen Array schreiben index++; //Und den Index aktualisieren } n[index]=value; //Wurzel in der Mitte speichern index++; //Und die rechte Reihenfolge hintendran hängen for(int i=0; i<r.length; i++){ n[index]=r[i]; index++; } return n; //Anschließend den neuen Array zurückgeben } Es folgte aufgrund vermehrter Fehler eine Wiederholung zum Sichtbarkeitsbereich von Variabeln: public class Test{ public void test(){ If(links!=null){ int l[]=links.gibInorder(); } l[x]=wurzel.wert; //Error, int l[] nicht bekannt } } Eine Variable ist nur innerhalb ihres Befehlsblockes(markiert durch geschweifte Klammern) bekannt. In diesem fall existiert die Variable l[] ab der } vor der Zeile, in der sie benutzt wird, nicht mehr. public class Test{ public void test(){ int l[]; If(links!=null){ l=links.gibInorder(); } //Error, int l[] möglicherweise nicht initialisiert l[x]=wurzel.wert; } } Diese Version funktioniert so lange, wie links ungleich null ist, weil sonst der Array zwar deklariert, aber nicht initialisiert wäre. int l[]=new int[0]; Kann dort Abhilfe verschaffen.