3. INFORMATIK-KLAUSUR IF-GK 12 (GA) 16.03.2000 − SEITE 1 − Aufgabe 1: Geben Sie bei den folgenden Aussagen an, ob sie wahr oder falsch sind. Begründen Sie ihre Antwort! Nr. wahr falsch Aussage Jeder Knoten eines Binärbaums hat zwei Knoten als Söhne. Jeder Knoten eines Binärbaums hat einen Knoten als Vater. 1. 2. 3. Ein Binärbaum hat immer den Grad 2. 4. Ein Binärbaum hat höchstens den Grad 2. Beim Löschen eines Elements aus einem Binärbaum ändert sich die Höhe dieses Baumes. Beim Einfügen eines Elements in einen Binärbaum bleibt die Höhe dieses Baumes unverändert. Ein Binärbaum mit der Höhe 5 besitzt mindestens 9 Knoten. 5. 6. 7. 8. Ein Binärbaum der Höhe 4 besitzt höchstens 15 Knoten. 9. Die Inorder-Ausgabe eines Suchbaums ist immer Sortiert. 10. Ein Suchbaum ist ein Binärbaum mit Ordnungsrelation. 11. Ein Suchbaum besitzt nur Knoten, deren Inhalte alle voneinander verschieden sind. Suchbäume und Binärbäume sind toll!!! Aufgabe 2: a) Welche der nachfolgend abgebildeten Bäume sind keine Binärbäume? Begründen Sie kurz Ihre Entscheidung. 1. 2. 3. b) Welche der nachfolgend abgebildeten Bäume sind keine Suchbäume? Begründen Sie kurz Ihre Entscheidung. 1. 2. 3. 6 4 5 3 3 3 2 1 7 4 5 2 4 8 9 2 5 1 6 3. INFORMATIK-KLAUSUR IF-GK 12 (GA) 16.03.2000 − SEITE 2 − Aufgabe 3: Implementieren Sie eine DELPHI-Funktion, welche die Höhe eines Binärbaums bestimmt und zurückgibt. Benutzen Sie dabei wann immer möglich die im Unterricht entwickelten Standardoperationen (Anlage 1). Starten Sie mit dem folgenden Funktionskopf: function BaumHoehe(b: PBinBaum): integer; var { hier kommen Ihre lokalen Variablen hin... Begin } { hier kommen Ihre DELPHI-Anweisungen hin... } End; Aufgabe 4: a) Löschen Sie nacheinander im untenstehenden Suchbaum die Elemente S, Z, M, K, F, R, G nach dem Verfahren des im Unterricht entwickelten Algorithmus SuchLoeschen (Anlage 2). Notieren Sie nach jeder Löschung den daraus resultierenden Baum. M F S A K B G R Z O b) Im Unterricht wurde besprochen, wie das Löschen eines Knotens mit zwei nicht leeren Teilbäumen optimiert werden könnte: Es ist nicht sinnvoll, den zu löschenden Knoten immer nur durch das größte Element im linken Teilbaum zu ersetzen (siehe auch den Algorithmus EchtLoeschen, zweiter Sonst-Zweig in Anlage 2). Vielmehr sollte man in Abhängigkeit des Höhenunterschieds zwischen linkem und rechtem Teilbaum den zu löschenden Knoten entweder durch das kleinste Element im rechten Teilbaum oder durch das größte Element im linken Teilbaum ersetzen. Optimieren Sie den Algorithmus EchtLoeschen wie oben beschrieben. Verwenden Sie dabei für die Fallunterscheidung die in Aufgabe 3 entwickelte Funktion BaumHoehe und geben Sie auch den Algorithmus BestimmeKleinstesElement an. Aufgabe 5: a) Geben Sie zum Binärbaum aus Aufgabe 4 die Preorder-, Inorder- und Postorder-Ausgabe an. b) Schreiben Sie eine DELPHI-Funktion, welche die Postorder-Ausgabe eines Binärbaums bestimmt und in einem String zurückgibt. Benutzen Sie dabei wann immer möglich die im Unterricht entwickelten Standardoperationen (Anlage 1). Starten Sie mit dem folgenden Funktionskopf: function PostOrder(b: PBinBaum): string; var { hier kommen Ihre lokalen Variablen hin... Begin } { hier kommen Ihre DELPHI-Anweisungen hin... } End; 3. INFORMATIK-KLAUSUR Anlage 1: { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { IF-GK 12 (GA) 16.03.2000 − SEITE 3 − --------------------------------------------------------------------------TOOL zum Datentyp Binärbaum: - Filenamen: <B_BAUM.ADT> <B_BAUM.TPU> Es wird der Datentyp 'PBinBaum' bereitgestellt - einschließlich der für ihn definierten Operationen, abhängig vom konkreten Datentyp TInhalt !!! Name des Datentyps: PBinBaum [ [ [ [ mit den Operationen: [ Baum = leer (NIL) oder Zeiger auf Wurzel + linker Teilbaum + rechter Teilbaum wobei die Teilbäume u.U. auch leer sein können (Blatt!) ] ] ] ] ] PROCEDURE InitBaum ( VAR baum: PBinBaum ); [ Einrichtung als leerer Baum (Initialisierung) ] FUNCTION BaumLeer ( baum: PBinBaum ): Boolean; [ ergibt TRUE gdw. der aktuelle Baum leer ist. ] PROCEDURE LiesWurzel ( baum: PBinBaum; VAR inhalt: TInhalt ); [ der Wurzelinhalt eines nicht (!) leeren Baumes wird ] [ der Inhaltsvariablen zugewiesen. ] PROCEDURE HoleLinkenTeilbaum ( baum: PBinBaum; VAR teilbaum: PBinBaum ); PROCEDURE HoleRechtenTeilbaum ( baum: PBinBaum; VAR teilbaum: PBinBaum ); [ Von einem nicht (!) leeren Baum wird der Teilbaum- ] [ variablen der bezeichnete Teilbaum zugewiesen. Der ] [ Baum selbst bleibt davon unberührt. ] PROCEDURE BelegeWurzelinhalt ( VAR baum: PBinBaum; inhalt: TInhalt ); [ einem nicht (!) leeren Baum wird der Wert der In] [ haltsvariablen in die Wurzel geschrieben. Die Teil- ] [ bäume bleiben davon unberührt. ] PROCEDURE FuegeTeilbaumLinksAn ( VAR baum: PBinBaum; teilbaum: PBinBaum ); PROCEDURE FuegeTeilbaumRechtsAn ( VAR baum: PBinBaum; teilbaum: PBinBaum ); [ einem nicht (!) leeren Baum wird der genannte Teil- ] [ baum angehängt. Die Teilbäume selbst müssen einge- ] [ richtet sein, können allerdings auch leer sein. Die ] [ Wurzel bleibt davon unberührt. ] PROCEDURE ErzeugeBlatt ( VAR baum: PBinBaum; inhalt: TInhalt ); [ es wird ein Baum mit dem Wurzelwert der Inhaltsvari-] [ ablen mit leeren Teilbäumen eingerichtet. ] FUNCTION LinksLeer ( baum: PBinBaum ): Boolean; FUNCTION RechtsLeer ( baum: PBinBaum ): Boolean; [ ist TRUE, gdw. entsprechender Teilbäume leer ist. ] FUNCTION IstBlatt ( baum: PBinBaum ): BOOLEAN; [ TRUE, falls der nicht (!) leere Baum nur leere Teil-] [ bäume besitzt. ] PROCEDURE LoescheBlatt ( VAR baum: PBinBaum ); [ ein eingerichteter und nicht (!) leerer Baum mit ] [ leeren Teilbäumen wird gelöscht, d.h. er wird leer. ] [ Außerdem wird der benutzte Speicherraum wieder dem ] [ System zur Verfügung gestellt. ] PROCEDURE LoescheBaum ( VAR baum: PBinBaum ); [ ein eingerichteter Baum wird gelöscht. Ist der Baum ] [ schon leer, so ist diese Operation ohne Funktion. ] [ ACHTUNG: auch die Teilbäume werden gelöscht ! ] PROCEDURE ErsetzeDurchLinkenTeilbaum ( VAR baum: PBinBaum ); PROCEDURE ErsetzeDurchRechtenTeilbaum ( VAR baum: PBinBaum ); [ der jeweils andere Teilbaum wird, falls nötig, ge- ] [ löscht und 'baum' wird ersetzt. ] ------------------------------- Version 1.0 D.Garmann / Bonn, am 22.02.2000 } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } 3. INFORMATIK-KLAUSUR IF-GK 12 (GA) 16.03.2000 − SEITE 4 − Anlage 2: SuchLoeschen Baum: PBinBaum ExistiertBereits: wahr oder falsch Inp-OBJEKT Suchelement: TInhalt HILFSOBJ. Wurzelkopie: TInhalt Teilbaum: PBinBaum • Falls der BaumLeer (Baum) ist, dann • ExistiertBereits ← falsch sonst • LiesWurzel (Baum, Wurzelkopie) • Falls Suchelement „gleich“ Wurzelkopie, • dann • EchtLoeschen (Baum, Suchelement) • ExistiertBereits ← wahr • sonst • Falls Suchelement „kleiner“ Wurzelkopie, • dann • HoleLinkenTeilbaum (Baum, Teilbaum) • SuchLoeschen (Teilbaum, Suchelement, ExistiertBereits) • FuegeTeilbaumLinksAn (Baum, Teilbaum) • sonst • HoleRechtenTeilbaum (Baum, Teilbaum) • SuchLoeschen (Teilbaum, Suchelement, ExistiertBereits) • FuegeTeilbaumRechtsAn (Baum, Teilbaum) ALGORITHMUS I/O-OBJEKTE EchtLoeschen Baum: PBinBaum LoeschKnoten: TInhalt Teilbaum: PBinBaum Existiert: wahr oder falsch • Falls der Baum RechtsLeer (Baum) ist, dann • ErsetzeDurchLinkenTeilbaum (Baum) sonst • Falls der Baum LinksLeer (Baum) ist, • dann • ErsetzeDurchRechtenTeilbaum (Baum) • sonst • HoleLinkenTeilbaum (Baum, Teilbaum) • BestimmeGroesstesElement (Teilbaum, LoeschKnoten) • BelegeWurzelinhalt (Baum, LoeschKnoten) • SuchLoeschen (Teilbaum, LoeschKnoten, Existiert) • FuegeTeilbaumLinksAn (Baum, Teilbaum) ALGORITHMUS I/O-OBJEKT HILFSOBJ. ALGORITHMUS BestimmeGroesstesElement I/O-OBJEKT Element: TInhalt Inp-OBJEKT Baum: PBinBaum HILFSOBJ. Teilbaum: PBinBaum • Falls der Baum RechtsLeer (Baum) ist, dann • LiesWurzel (Baum, Element) { Element ← Wurzel von Baum} sonst • HoleRechtenTeilbaum (Baum, Teilbaum) • BestimmeGroesstesElement (Teilbaum, Element)