D-MAVT::Informatik I ¨Ubung 12: Bäume und Rekursion

Werbung
D-MAVT::Informatik I
Frühlingssemester 2014
Übung 12: Bäume und Rekursion
Ausgabe: 20. Mai 2014
Abgabe: 27. Mai 2014
1
Binärer Suchbaum
(60 Punkte)
Schreiben Sie Code, um einen binären Suchbaum zu erstellen und mit Integer Werten zu füllen. Die
Integer Werte sollen Sie aus einer Datei einlesen. Orientieren Sie sich dabei an den Vorlesungsslides.
Als erstes definieren Sie ein struct Node, welches einen Integer Wert und zwei Pointer auf das jeweilige
linke und rechte Kinde beinhaltet. Dann implementieren Sie eine Funktion
void insert ( Node * node , int value )
welche den Baum node traversiert und den Wert value einfügt. Sie können die Funktion mittels forSchleife oder einfacher über eine Rekursion programmieren. In einer Rekursion testet die Funktion
erst ob der aktuelle node den Wert value repräsentiert und würde in diesem Fall beenden. Ansonsten
wird der Wert value mit dem Wert im Knoten verglichen, um herauszufinden ob value in den linken
oder rechten Teilbaum eingefügt werden muss. Falls der Teilbaum existiert (nicht NULL ist), wird rekursiv insert(node->left, value) respektive insert(node->right, value) aufgerufen. Falls der Teilbaum
nicht existiert, wird ein neuer Knoten über new erstellt, die Kinder mit NULL initialisiert (wichtig!), der Wert value gesetzt und als Kind an node->left respektive node->right angehängt.
Laden Sie sich nun von der Vorlesungsseite die Input-Datei herunter (in den Projekt-Ordner) und
schreiben Sie Code, welcher die Datei öffnet, in einer for-Schleife die Integer-Werte einliest und mit
Ihrer inser-Funktion einfügt. Vorsicht, insert funktioniert nur wenn der Baum mindestens einen Knoten beinhaltet, für das erste eingelesene Element müssen Sie also den Baum erst erstellen! Vergessen
Sie nicht, den File-Stream wieder zu schliessen.
2
Durchlaufordnung
(20 Punkte)
Sie haben in der Vorlesung etwas über das rekursive Durchlaufen von Binärbäumen gelernt, sowie
Codebeispiele dazu gesehen. Erweitern Sie nun den Code aus vorheriger Aufgabe: Schreiben Sie
ähnlich zum Codebeispiel in der Vorlesung die rekursiven Funktionen
void printAscending(Node* node)
und
void printDescending(Node* node)
welche den Inhalt des Baumes in auf- und absteigender Reihenfolge auf die Konsole ausgeben.
Überlegen Sie sich dazu, welchen Teilbaum Sie zuerst traversieren müssen und an welchem Punkt in
der Funktion Sie den Wert des aktuellen Knotens auf die Konsole ausgeben. Vergessen Sie nicht, ein
geeignetes Terminierungskriterium für die Rekursion zu finden (lassen Sie sich durch die Vorlesungsslides inspirieren). Rufen Sie beide Funktionen aus der main-Funktion auf, nachdem Sie den Baum
erstellt haben.
3
Speicher Freigeben
(20 Punkte)
Alles was noch zu tun bleibt, ist, den Speicher am Ende wieder freizugeben. Implementieren Sie die
Funktion
void deleteTree(Node* node)
welche rekursiv erst den linken Teilbaum, dann den rechten Teilbaum und dann den übergebenen
Knoten löscht und rufen Sie sie am Ende von main auf.
Herunterladen