Fachhochschule Regensburg Ausgeglichene binäre Suchbäume Splay-Baum 9. Aufgabenblatt Algorithmen und Datenstrukturen Name: ________________________ Aufgabensteller: Prof. Sauer Vorname: _____________________ 1. Aufgabe: Splay-Baum Welche Gestalt nimmt ein nach der in der 8. Übung angegebenen Regeln aufgebauter Splay-Baum nach Eingabe der Zahlen „ 1 2 3 4 5 6 7 8 9 10 11 12 0“ an? 2. Aufgabe: Splay-Baum Gegeben ist die Zahlenfolge 10 20 30 40 50. 1. In dieser Reihenfolge werden die Zahlen in das unter der Übung 8 angegebene Programm zum Erzeugen eines Splay-Baums angegeben und in einen Splay-Baum eingefügt. a) Welche Gestalt nimmt der Splay-Baum jeweils nach Eingabe der Zahlen an? b) Führe einen Schreibtischtest mit dem in Übung 8 angegebenen Programm aus. Gib zu diesem Schreibtischtest alle Aufrufe von Programmbestandteilen an und zeige anhand von Darstellung der Baumstruktur jegliche Veränderung der Baumgestalt an. 2. Führe, nachdem der Splay-Baum erstellt wurde, den Zugriff auf dem kleinsten Schlüssel und danach auf den größten Schlüssel durch. a) Welche Gestalt nimmt der Splay-Baum jeweils nach den Zugriffen an? b) Zeige mit einem Schreibtischtest, der alle Aufrufe von Programmbestandteilen aus dem Programm der Übung 8 auflistet, wie die Gestalt des Baums sich entwickelt. Falls dabei der Baum bis zum endgültigen Resultat unterschiedliche Darstellungen zeigt, gibt alle Darstellungen (Zwischenwerte) des Splay-Baums an. 3. Lösche, nachdem der Splay-Baum erstellt wurde, den kleinsten und den größten Schlüssel a) Welche Gestalt nimmt der Splay-Baum jeweils nach dem Löschen an? b) Zeige mit einem Schreibtischtest, der alle Aufrufe von Programmbestandteilen aus dem Programm der Übung 8 auflistet, wie die Gestalt des Baums sich entwickelt. Falls dabei der Baum bis zum endgültigen Resultat unterschiedliche Darstellungen zeigt, gibt alle die Darstellungen (Zwischenwerte)des Splay-Baums an. Lösungen 1. Aufgabe Welche Gestalt nimmt ein nach der in der 8. Übung angegebenen Regeln aufgebauter Splay-Baum nach Eingabe der Zahlen „ 1 2 3 4 5 6 7 8 9 10 11 12 0“ an? 1 1 2 2 1 3 3 2 1 4 4 3 2 1 1 5 5 4 3 2 1 6 6 5 4 3 2 1 7 7 6 5 4 3 2 1 ... 12 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 11 9 7 5 3 2 12 10 8 6 4 2. Aufgabe: Splay-Baum Gegeben ist die Zahlenfolge 10 20 30 40 50. 1. In dieser Reihenfolge werden die Zahlen in das unter der Übung 8 angegebene Programm zum Erzeugen eines Splay-Baums angegeben und in einen Splay-Baum eingefügt. a) Welche Gestalt nimmt der Splay-Baum jeweils nach Eingabe der Zahlen an? 10 10 20 20 10 30 30 20 10 40 40 30 20 10 50 50 40 30 20 10 b) Führe einen Schreibtischtest mit dem in Übung 8 angegebenen Programm aus. Gib zu diesem Schreibtischtest alle Aufrufe von Programmbestandteilen an und zeige anhand von Darstellung der Baumstruktur jegliche Veränderung der Baumgestalt an. 2. Führe, nachdem der Splay-Baum erstellt wurde, den Zugriff auf dem kleinsten Schlüssel und danach auf den größten Schlüssel durch. a) Welche Gestalt nimmt der Splay-Baum jeweils nach den Zugriffen an? Zugriff auf das kleinste Element: 10 40 20 50 30 Zugriff auf das größte Element: 50 40 10 20 30 b) Zeige mit einem Schreibtischtest, der alle Aufrufe von Programmbestandteilen aus dem Programm der Übung 8 auflistet, wie die Gestalt des Baums sich entwickelt. Falls dabei der Baum bis zum endgültigen Resultat unterschiedliche Darstellungen zeigt, gibt alle Darstellungen (Zwischenwerte) des Splay-Baums an. 3. Lösche, nachdem der Splay-Baum mit der Zahlenfolge 10, 20, 30, 40, 50 erstellt wurde, den kleinsten und den größten Schlüssel a) Welche Gestalt nimmt der Splay-Baum jeweils nach dem Löschen an? Löschen 10 40 20 50 30 Löschen 50 40 20 30 b) Zeige mit einem Schreibtischtest, der alle Aufrufe von Programmbestandteilen aus dem Programm der Übung 8 auflistet, wie die Gestalt des Baums sich entwickelt. Falls dabei der Baum bis zum endgültigen Resultat unterschiedliche Darstellungen zeigt, gibt alle die Darstellungen (Zwischenwerte)des Splay-Baums an. 9. Aufgabenblatt Aufgabe 2b. alternativ Schreibtischtest Splay - Baum (10 20 30 40 50) Einfuegen Zahl? eingabeZeile = eingabe.readLine(); 10 b.insert(new Integer(zahl)); if( newNode == null ) newNode = new BinaerBaumknoten( null ); newNode.daten = x; if( root == nullNode ) newNode.links = newNode.rechts = nullNode; root = newNode; newNode = null; // So next insert will call new b.ausgBinaerbaum(b.holeWurzel(),2); // hole Wurzel return root; // public void ausgBinaerbaum(BinaerBaumknoten b, int stufe) if (b != b.links) ausgBinaerbaum(b.links,stufe + 3); for (int i = 0; i < stufe; i++) System.out.print(' '); System.out.println(b.daten.toString()); ausgBinaerbaum(b.rechts,stufe + 3); Ausgabe: while (eingabeZeile != ""); 10 Zahl? eingabeZeile = eingabe.readLine(); 20 b.insert(new Integer(zahl)); if( newNode == null ) newNode = new BinaerBaumknoten( null ); newNode.daten = x; if( root == nullNode ) else root = splay( x, root ); else if( x.compareTo( root.daten ) > 0 ) newNode.rechts = root.rechts; newNode.links = root; root.rechts = nullNode; root = newNode; newNode = null; // So next insert will call new b.ausgBinaerbaum(b.holeWurzel(),2); s.o. 10 Ausgabe: 20 Zahl? eingabeZeile = eingabe.readLine(); 30 b.insert(new Integer(zahl)); s.o. b.ausgBinaerbaum(b.holeWurzel(),2); s.o. Ausgabe: 10 20 10 Zahl? 40 eingabeZeile = eingabe.readLine(); b.insert(new Integer(zahl)); s.o. b.ausgBinaerbaum(b.holeWurzel(),2); s.o. Ausgabe: 10 20 30 40 Zahl? 50 eingabeZeile = eingabe.readLine(); b.insert(new Integer(zahl)); s.o. b.ausgBinaerbaum(b.holeWurzel(),2); s.o. Ausgabe: 10 20 30 40 50 Löschen Zahl? eingabeZeile = eingabe.readLine(); 10 b.remove(new Integer(zahl)); root = splay( x, root ); if( root.daten.compareTo( x ) != 0 ) if( root.links == nullNode ) neuerBaum = root.rechts; root = neuerBaum; b.ausgBinaerbaum(b.holeWurzel(),2); if (b != b.links) ausgBinaerbaum(b.links,stufe + 3); for (int i = 0; i < stufe; i++) System.out.print(' '); Ausgabe: 20 40 30 50 Zahl? eingabeZeile = eingabe.readLine(); b.remove(new Integer(zahl)); s.o b.ausgBinaerbaum(b.holeWurzel(),2); s.o Ausgabe: 30 40 50 20 Zahl? eingabeZeile = eingabe.readLine(); 30 40 b.remove(new Integer(zahl)); s.o b.ausgBinaerbaum(b.holeWurzel(),2); s.o Ausgabe: 40 50 Zahl? eingabeZeile = eingabe.readLine(); b.remove(new Integer(zahl)); s.o b.ausgBinaerbaum(b.holeWurzel(),2); s.o Ausgabe: 50