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
SortToLeft
SortToRight
...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