3. INFORMATIK-KLAUSUR Name: Bearbeitungszeit: 90 min Info 12 GK (GA) Thema: 15.03.2002 − Seite 1 − Bäume − Binärbaume – Suchbäume Aufgabe 1: Begründen oder widerlegen Sie die folgenden Aussagen: (1) Jeder Knoten eines Binärbaums hat zwei nichtleere Teilbäume (2) Beim Löschen eines Elements aus einem Binärbaum ändert sich die Höhe dieses Baumes. (3) Beim Einfügen eines Elements in einen Binärbaum kann die Höhe dieses Baumes unverändert bleiben. (4) Die Inorder-Ausgabe eines Suchbaums ist immer Sortiert. (5) Ein Binärbaum der Höhe 4 besitzt höchstens 15 Knoten. (6) Ein Binärbaum mit der Höhe 5 besitzt mindestens 7 Knoten. Aufgabe 2: Im Unterricht haben wir drei verschiedene Gruppen von Bäumen kennen gelernt: Gruppe A: Suchbäume Gruppe B: Binärbäume Gruppe C: Bäume Gruppe D: keine Bäume (Graphen) Diese stehen in einem rechts veranschaulichten Hierarchieverhältnis. (D) Graphen (C) Bäume (B) Binärbäume (A) Suchbäume Ordnen Sie jede der nachfolgenden Strukturen einer dieser Gruppen zu und begründen Sie kurz, warum die Struktur zur angegebenen Hierarchie gehört. (2) (1) (3) C B F E (4) (5) 10 6 4 7 04.03.2002 19.09.2001 9 5 P 8 08.07.2001 25.05.2002 04.03.2002 01.10.2003 Aufgabe 3: Zeichnen Sie den Graphen eines zu Anfang leeren Suchbaumes, in den nacheinander die folgenden Elemente eingefügt werden (Eine Zeichnung reicht aus!): 3, 1, 7, 2, 12, 6, 4, 10, 8, 5, 11, 9 Aufgabe 4: Geben Sie zum nachfolgenden Binärbaum die Preorder-, Inorder- und PostorderTraversierung an. der Freitag ein ist guter zum Tag Klausur schreiben Name: 3. INFORMATIK-KLAUSUR 15.03.2002 Info 12 GK (GA) Bearbeitungszeit: 90 min − Seite 2 − Aufgabe 5: Löschen Sie nacheinander die folgenden Elemente aus dem rechts abgebildeten Suchbaum. 6 9, 8, 7, 3, 6, Halten Sie sich dabei exakt an das im Unterricht 3 entwickelte Verfahren SuchLöschen (Anlage I). Zeichnen 2 5 7 Sie nach jeder Löschaktion den Graphen des daraus resultierenden Baumes. (Insgesamt sind also 5 Bäume zu 1 4 zeichnen!) Aufgabe 6: Entwickeln Sie eine Funktion, welche die Anzahl der Knoten eines Baumes zählt, die genau einen nichtleeren Teilbaum besitzen. Die Funktion angewendet auf den Baum aus Aufgabe 5 würde als Ergebnis die Zahl 2 liefern, da nur die Knoten 2 und 5 genau einen nichtleeren Teilbaum besitzen. Verwenden Sie wann immer möglich die Binbaum-Methoden (Anlage II). function TBinBaum.HalbbaumAnzahl: integer; Aufgabe 7: Die Inhalte eines Suchbaums sollen in einen File geschrieben werden. a) Begründen Sie, warum eine Methode SaveToFile, welche in der Klasse TSuchbaum deklariert würde, nur Textdateien erzeugen könnte. b) Begründen Sie, warum eine Methode LoadFromFile in der Klasse TSuchbaum sogar unsinnig wäre. Viel Erfolg! 8 10 9 11 Anlage II: { { { { { { { { { { { { { { { Der Datentyp TBinbaum in Delphi ----------------------------------------------------------------------------------------------------------------- } } Die Unit stellt einen inhaltslosten Datentypen TBinBaum zur Verfügung. Um einen Binärbaum mit Inhalt zu erhalten, } muss eine hiervon abgeleitete Klasse erstellt werden, z. B.: } } type TIntBinBaum = class(TBinBaum) } public } Wurzelinhalt: integer; } constructor Create(w: Integer); } function WurzelinhaltToString: string; override; } end; } } Ein Binärbaum kann entweder leer sein (NIL) oder eine Wurzel mit zwei evtl. leeren Teilbäumen rtb, ltb } } ----------------------------------------------------------------------- Tool zum Binärbaum, (C) 2001 D. Garmann - } unit Binbaum; interface type TBinBaum = class private ltb, rtb: TBinBaum; public constructor Create; destructor function function function function procedure procedure function function function function function end; { Erzeugt ein Blatt, d.h. "leeres Element mit rtb=ltb=NIL } Destroy; { Zerstört das Element inklusive seiner Teilbäume } Leer: boolean; { Liefert "true" wenn der Baum leer ist, d. h. der Baum ist = NIL } WurzelinhaltToString: string; virtual; abstract; { Abstracte Methode zur Darstellung des Inhalts auf dem Bildschirm (Editfeld, etc.) } LinkerTeilbaum: TBinBaum; { Liefert den Linken Teilbaum im Funktionsergebnis zurück. RechterTeilbaum: TBinBaum; { Liefert den Rechten Teilbaum im Funktionsergebnis zurück. FuegeTeilbaumLinksAn(tb: TBinBaum); { Fügt einen Teilbaum an das aktuelle { VORSICHT! Ein eventuell vorhandener FuegeTeilbaumRechtsAn(tb: TBinBaum); { Fügt einen Teilbaum an das aktuelle { VORSICHT! Ein eventuell vorhandener } } Baumelement links an. linker Teilbaum geht verloren! } } Baumelement rechts an. rechter Teilbaum geht verloren! } } LinksLeer: Boolean; { Liefert "true" wenn der linke Teilbaum leer ist, d. h. ltb=NIL { VORSICHT! Ein leerer Baum hat keinen linken Teilbaum => Laufzeitfehler RechtsLeer: Boolean; { Liefert "true" wenn der rechte Teilbaum leer ist, d. h. rtb=NIL { VORSICHT! Ein leerer Baum hat keinen rechten Teilbaum => Laufzeitfehler IstBlatt: Boolean; { Liefert "true", wenn das aktuelle Element leere Teilbäume hat. ErsetztDurchLinkenTeilbaum: TBinBaum; { Liefert den Linken Teilbaum im Funktionsergebnis zurück und LÖSCHT den Rest. ErsetztDurchRechtenTeilbaum: TBinBaum; { Liefert den Rechten Teilbaum im Funktionsergebnis zurück und LÖSCHT den Rest. } } } } } } } Anlage I: Ja Algorithmus Suchlöschen aktueller Baum leer? Ja Nein aktueller Baum „gleich“ Suchelement? Nein akt. Baum „größer“ Suchel.? {Nicht gefunden} • {gefunden} Führe „EchtLöschen“ aus ExistiertBereits ↑ FALSCH ExistiertBereits ↑ WAHR • Ja Betrachte den linken Teilbaum und führe „Suchlöschen“ darin aus Hänge diesen Teilbaum wieder an den aktuellen Baum links an Nein • Betrachte den rechten Teilbaum und führe „Suchlöschen“ darin aus • Hänge diesen Teilbaum wieder an den aktuellen Baum rechts an Algorithmus: „EchtLöschen“ Ja aktueller Baum rechts leer? Nein aktueller Baum links leer? Ersetze akt. Baum durch linken Teilbaum Ja Ersetze akt. Baum durch rechten Teilbaum {inklusive Blatt abschneiden} {inklusive Blatt abschneiden} • • • • • Nein Betrachte den linken Teilbaum „IsolieregrößtesElement:“ darin: GroesstesElement Hänge beide Teilbäume vom aktuellen Baum an das GroesstesElement Isoliere die Wurzel des aktuellen Baumes und gib dafür den Speicher frei Ändere den aktuellen Baum ab in GroesstesElement 3. INFORMATIK-KLAUSUR 15.03.2002 − Seite 1 − Lösungen Info 12 GK (GA) Aufgabe 1: Die Begründungen lauten wie folgt: (1) falsch, da z. B. ein Blatt zwei leere Teilbäume besitzt, aber dennoch ein Binärbaum ist. (2) Für Suchbaum aus 2, 1, 3 aufgebaut gilt: das Löschen der 1 ändert die Höhe nicht. (3) Korrekt, da für Suchbaum aus 2, 1 aufgebaut gilt: das Einfügen der 3 ändert Höhe nicht. (4) InOrder gibt erst alle kleineren Elemente als Wurzel, dann die Wurzel und anschließend alle größeren Elemente aus. Da dies rekursiv ist, ist die Ausgabe aufsteigend sortiert. (5) Korrekt, da: erste Ebene: max 1 Element, zweite Ebene: max. 2 Elemente, 3. Ebene: max. 4 Elemente, 4. Ebene: max. 8 Elemente. Insgesamt: 1+2+4+8 = 15 Elemente maximal. (6) Falsch, da z. B. der Suchbaum aus 1,2,3,4,5 aufgebaut die Höhe fünf hat, ein Binärbaum ist aber weniger als 9 Elemente hat. Aufgabe 2: Die Zugehörigkeit ist wie folgt: (1): Gruppe C. Nicht B, da 3 Teilbäume an einem Knoten hängen (2): Gruppe A. (3): Gruppe D. Nicht C, da ein Knoten zwei Väter hat. (4): Gruppe B. Nicht A, da Ordnungsrelation verletzt. (5): Gruppe B. Nicht A, da 04.03.2002 doppelt vorhanden. Aufgabe 3: Der Baum sieht wie folgt aus: Aufgabe 4: PreOrder: InOrder: PostOrder: Die Ausgaben lauten: der Freitag ein zum guter ist Tag Klausur schreiben ein zum Freitag guter der ist Klausur Tag schreiben zum ein guter Freitag Klausur schreiben Tag ist der Aufgabe 5: Die Bäume sehen wie folgt aus: 6 3 2 8 5 1 6 7 3 10 4 2 11 6 3 2 1 4 5 1 10 4 11 6 10 5 7 2 11 1 10 5 4 5 2 11 1 10 4 11 3. INFORMATIK-KLAUSUR Info 12 GK (GA) Aufgabe 6: Lösungen Eine Implementierung könnte wie folgt aussehen: 15.03.2002 − Seite 2 − function TBinBaum.HalbbaumAnzahl: integer; var anz: integer; begin if leer then anz:= 0 else begin if (linksleer and (not rechtsleer)) or (rechtsleer and (not linksleer)) then anz:= 1 else anz:= 0; anz:= anz + linkerTeilbaum.HalbbaumAnzahl + rechterTeilbaum.HalbbaumAnzahl; end; HalbbaumAnzahl:= anz; end; Eine andere Möglichkeit wäre z. B.: function TBinBaum.HalbbaumAnzahl: integer; begin if leer or istBlatt then HalbbaumAnzahl:= 0 else if linksleer then HalbbaumAnzahl:= 1 + rechterTeilbaum.HalbbaumAnzahl else if rechtsleer then HalbbaumAnzahl:= 1 + linkerTeilbaum.HalbbaumAnzahl else HalbbaumAnzahl:= linkerTeilbaum.HalbbaumAnzahl + rechterTeilbaum.HalbbaumAnzahl; end; Aufgabe 7: Die Begründungen: a) Da der TSuchbaum inhaltslos definiert ist, kann lediglich auf die Funktion WurzelinhaltToString zurückgegriffen werden. Die SaveToFile kann somit zwar die Inhalte von Nachkommen von TSuchbaum ausgeben, allerdings nur als String konvertiert. Damit ist nur eine Textdatei möglich. b) Da TSuchbaum noch keine Ahnung hat, welcher Inhalt konkret in ihm gespeichert wird, ist eine Konvertierung des Textfiles in den entsprechenden Datentypen unmöglich. Eine Methode LoadFromFile würde also keinen Sinn machen. In der Klasse TIntSuchbaum dagegen wäre eine solche Methode durchaus denkbar.