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.