Informatik/Jahrgangsstufe Q/001 Klausuren/Q1/2001-2002-3

Werbung
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.
Herunterladen