Algorithmik II Aufgabe 10 6. Übung Binäre Bäume a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein. Lösungsvorschlag: 1. Einfügen von 20: 3. Einfugen von 35: 20 20 2. Einfügen von 28: 28 20 28 35 . . . 10. Einfügen von 25: 20 9 4 28 25 13 17 35 31 37 b) Löschen Sie aus dem in der vorigen Teilaufgabe gewonnenen binären Baum hintereinander die Schlüssel 37, 35 und 20. Lösungsvorschlag: Allgemein treten beim Löschen in einem binären Baum die folgenden 3 Fälle auf: • Der zu löschende Eintrag hat zwei leere Unterbäume (Beispiel: Löschen von 37): Der Eintrag kann einfach entfernt werden. • Der zu löschende Eintrag hat einen leeren Unterbaum (Beispiel: Löschen von 35): Der Eintrag wird durch seinen nicht–leeren Unterbaum ersetzt. • Der zu löschende Eintrag hat keinen leeren Unterbaum (Beispiel: Löschen von 20): Der Eintrag wird durch den größten Eintrag in seinem linken Unterbaum ersetzt. Dies ist aufgrund der Einfügestrategie immer ein Blattknoten“, d. h. ein Eintrag mit zwei leeren ” Unterbäumen. 2. Juni - 6. Juni 2003 -1- Sommersemester 2003 Algorithmik II 6. Übung 1. Löschen von 37: 20 9 28 25 13 4 17 35 31 2. Löschen von 35: 20 9 28 25 13 4 31 17 3. Löschen von 20: 17 9 4 2. Juni - 6. Juni 2003 28 25 13 -2- 31 Sommersemester 2003 Algorithmik II Aufgabe 11 6. Übung AVL-Bäume a) Fügen Sie in einen zu Beginn leeren AVL(1)–Baum die Schlüsselfolge 10, 20, 30, 40, 50, 60, 70, 80 ein. Lösungsvorschlag: 2. Juni - 6. Juni 2003 -3- Sommersemester 2003 Algorithmik II 6. Übung 10|2 10|0 20|0 10|1 2 3 R 20|1 10|0 20|0 30|0 30|0 20|1 20|2 4 5 10|0 30|1 10|0 30|2 40|0 40|1 50|0 20|2 20|1 R 6 10|0 10|0 40|0 30|0 40|1 30|0 50|0 50|1 60|0 40|0 40|1 R 7 20|0 10|0 50|1 30|0 20|0 60|0 10|0 50|2 30|0 60|1 70|0 40|0 40|1 R 8 20|0 10|0 60|0 30|0 50|0 20|0 70|0 10|0 60|1 30|0 50|0 70|1 80|0 Das Beispiel zeigt sehr deutlich, daß das Einfügen einer bereits sortierten Folge in einen AVL–Baum einen gewaltigen Reorganisationsaufwand benötigt. Nachdem die Folge in aufsteigender Reihenfolge sortiert ist, werden nur linke“ Einfachrotationen ausgeführt. ” 2. Juni - 6. Juni 2003 -4- Sommersemester 2003 Algorithmik II 6. Übung b) Geben Sie eine Reihenfolge für die Zahlen 10,. . . , 80 an, so daß ihre aufeinanderfolgende Einfügung in einen zunächst leeren AVL(1)–Baum keine Rotationsoperation benötigt. Lösungsvorschlag: Aus dem unter a) gewonnen AVL–Baum kann man eine solche Reihenfolge direkt ablesen, z. B. 40, 20, 60, 10, 30, 50, 70, 80 Weitere Möglichkeiten sind • 40, 60, 20, 50, 70, 10, 30, 80 • 40, 60, 20, 50, 10, 70, 30, 80 • 40, 60, 20, 30, 50, 70, 10, 80 • ... 2. Juni - 6. Juni 2003 -5- Sommersemester 2003 Algorithmik II 6. Übung c) Fügen Sie in den in Teilaufgabe a) entstandenen AVL-Baum nun den Schlüssel 75 ein. Lösungsvorschlag: Hier ist eine Doppelrotation notwendig. 40|2 40|1 20|0 10|0 20|0 60|1 30|0 50|0 60|2 75 10|0 70|1 30|0 50|0 70|2 80|-1 80|0 75|0 40|1 20|0 60|1 R 10|0 30|0 50|0 75|0 70|0 Aufgabe 20 80|0 B-Bäume a) Fügen Sie die Schlüsselfolge 6, 21, 29, 3, 13, 19, 8, 11, 5, 7, 15 in einen anfangs leeren B–Baum der Ordnung 2 ein. Lösungsvorschlag: 2. Juni - 6. Juni 2003 -6- Sommersemester 2003 Algorithmik II 6. Übung Einfügen von 6, 21, 29 und 3: 6 6, 21 6, 21, 29 3, 6, 21, 29 Einfügen von 13: 13 3, 6 21, 29 Einfügen von 19, 8 und 11: 13 3, 6, 8, 11 19, 21, 29 Einfügen von 5: 6, 13 3, 5 8, 11 19, 21, 29 Einfügen von 7 und 15: 6, 13 3, 5 7, 8, 11 15, 19, 21, 29 Das Einfügen der ersten vier Schlüssel bereitet keinerlei Schwierigkeiten. Die Wurzel eines B–Baums der Ordnung 2 kann zwischen einem und vier Elementen enthalten. Man muß somit beim Eintragen der ersten vier Schlüssel nur auf die richtige Reihenfolge im Wurzelknoten 2. Juni - 6. Juni 2003 -7- Sommersemester 2003 Algorithmik II 6. Übung achten. Das Einfügen der 13 erfordert ein neues Niveau. Nachdem der einzufügende Schlüssel in der Mitte der bereits vorhandenen Schlüssel liegt, wird 13 zum einzigen Element der neuen Wurzel. Die bereits vorhandenen Schlüssel werden gleichmäßig - unter Beachtung der Reihenfolge - auf zwei Knoten aufgeteilt. Das Einfügen der nun folgenden Schlüssel 19, 8 und 11 ist problemlos möglich, da die Knoten des Niveaus 1 noch ausreichend Platz bieten. Zum Eintragen des Schlüssels 5 ist die Einführung eines neuen Knotens notwendig. Da der Schlüssel 5 in die linke Hälfte des vollen Knotens gehört, wird der links von der Mitte stehende Schlüssel (6) nach oben gezogen“. ” Das Einfügen der Schlüssel 7 und 15 ist ohne Schwierigkeiten möglich. b) Löschen Sie aus dem in der vorigen Teilaufgabe gewonnen B–Baum nacheinander die Schlüssel 13 und 6. Lösungsvorschlag: Löschen von 13: 6, 11 3, 5 7, 8 15, 19, 21, 29 Löschen von 6: 1. Phase: 5, 11 3 7, 8 15, 19, 21, 29 2. Phase: 11 3, 5, 7, 8 15, 19, 21, 29 Das Löschen eines Schlüssels, der nicht Element eines Blattknotens ist, geschieht wie folgt: 2. Juni - 6. Juni 2003 -8- Sommersemester 2003 Algorithmik II 6. Übung Zuerst wird der Schlüssel durch den größten Schlüssel seines linken Teilbaums ersetzt. Für den Fall, daß der resultierende Baum noch ein B–Baum ist, d. h. der Blattknoten aus dem gelöscht wurde, noch genügend Elemente hat, ist der Löschvorgang nach diesem Schritt beendet (Beispiel: Löschen von 13). Ansonsten ist nach einem Nachbarknoten zu suchen, der mehr Elemente als notwendig hat, oder es sind zwei Nachbarknoten zu verschmelzen. Beim Löschvorgang für den Schlüssel 6 hat der Nachbarknoten des defizitären Knotens gerade ausreichend viele Elemente. Somit ist eine Verschmelzung notwendig. Eine Verschmelzung hat natürlich auch immer zur Folge, daß das Zwischenelement des Elternknotens der zu verschmelzenden Knoten aufzulösen ist (5). Rechnerübung 10 Binäre Bäume Sie haben in der Vorlesung Binäre Bäume kennengelernt. Schreiben Sie nun in Java eine Methode height, die die Höhe eines Baumes berechnet. Die Programm-Quellen für eine mögliche Implementierung von binären Bäumen in Java finden Sie auf der Homepage zu den Übungen im WWW. Lösungsvorschlag: class TreeNode { ... public int height() { int leftHeight = 0; int rightHeight = 0; if(left != null) leftHeight = left.height(); if(right != null) rightHeight = right.height(); return (1 + Math.max(leftHeight, rightHeight)); } } public class Tree { ... public int height() { if(rootNode != null) return rootNode.height(); else return 0; } } 2. Juni - 6. Juni 2003 -9- Sommersemester 2003