In der letzten Übungsaufgabe in diesem Semester wollen wir uns noch einmal den binären Bäumen widmen.
Dieser binäre Baum wird durch sortiertes Einfügen aufgebaut. Vom Wurzelknoten aus wird der Baum nach links bzw. rechts erweitert, je nachdem, ob der eingefügte Knoten größer oder kleiner dem Vorgängerknoten ist. Der Baum ist nicht ausbalanciert, zumindest so lange nicht, wie nur eingefügt und gelöscht wird.
Es soll ein Interface geschrieben werden, welches uns das Einfügen, Umgestalten, Löschen und Traversieren im Baum erlaubt.
Anforderungen
sort (Sortierfunktionen)change (Manipulationsfunktionen)prad (Prädikatsfunktionen)-pg uebersetzen. Nun wird standardmäßig eine sogenannte profiling Datei mit dem Namen gmon.out erzeugt. Ist das Programm einmal übersetzt, muß es gestartet werden. Das Programm verhält sich dann wie immer und macht auch die gleichen Ausgaben. Beim Beenden des Programms werden alle profiling Informationen in die gmon.out geschrieben. Existiert diese Datei bereits, wird sie überschrieben. Die profiling Datei wird in das aktuelle Arbeitsverzeichnis geschrieben. gprof -b <Programmname>Hinweise
Hallo erzeugt, oder Hallo wurde zuerst in den Baum eingefügt. Danach wurden Anton und Moritz in den Baum eingefügt. In welcher Reihenfolge beide eingefügt wurden ist egal, da es nichts am Baum ändert. Anton ist vom Standpunkt eines String gesehen kleiner als Hallo, wird daher links eingefuegt, Moritz ist größer als Hallo, wird daher rechts eingefügt. Anna ist kleiner als Hallo und kleiner als Anton, folglich wird sie links von Anton eingefügt, etc.
SortToRight
SortToLeftSortToRight ...SortToBalance
removePartTree()) und löscht von einem bestehenden Objekt das Objekt selbst und alles was dran hängt. Diese Funktion muß von jedem realisiert werden!removeTree()) löscht nur ein Objekt aus dem Baum und organisiert den daran hängenden Teilbaum nach folgendem Wirth-Algorithmus:PROCEDURE delete(x:INTEGER; var p: ref);
var q: ref;
PROCEDURE del(var r: ref);
BEGIN IF r^.right <> NIL THEN del (r^.right) ELSE
BEGIN q^.key := r^.key;
q^.count := r^.count;
q := r;
r := r^.left
END
END;
BEGIN{delete}
IF p=NIL THEN writeln('Wort nicht im Baum') ELSE
IF x < p^.key THEN delete(x,p^.left) ELSE
IF x > p^.key THEN delete(x,p^.right) ELSE
BEGIN {entferne p^} q:=p;
IF q^.right = NIL THEN p:=q^.left ELSE
IF q^.left = NIL THEN p:=q^.right
ELSE del(q^.left);
dispose(q);
END
END {delete}
Dieser Algorithmus muß natürlich auf die bestehenden Belange angepaßt werden. So kann z.B. count und key vernachläßigt werden, da wir ja nur ein wort in unserem Baum haben. Diese Funktion muß für Bonuspunkte realisiert werden.sortToBalance()removeTree()Gutes Gelingen!
Download Beispiel-Lösungsvorschlag, Quelltext inkl. Projektdateien für VC6 (ZIP-Archiv, 48 KB)
Gefällt dir die C Übungsaufgabe? Schreibe doch einen Kommentar...
Diese Website benutzt Cookies. 🍪 Wenn Sie die Website weiter nutzen, stimmen Sie der Verwendung von Cookies zu. Mehr Infos