Das Hauptproblem besteht darin, dass du Information auf dem File
benötigst, welche dir eine Rekonstruktion der Verpointerung ermöglicht.
Denn das Problem ist natürlich, dass dir die Pointer an sich nicht
weiter helfen, denn im nächsten Programmlauf haben die keine Bedeutung
mehr.
Wenn es (in der Implementierung) schnell gehen muss, dann mach ich das
gerne so, dass ich in der Datenstruktur einen 'reserved' Wert bei jedem
Knoten habe. Vor dem Speichern werden die Knoten durchnummeriert. Beim
Schreiben aufs File wird dann bei jedem Knoten die Nummer seines Vaters
im File mit vermerkt. Wenn ich dafür sorge, dass beim Schreiben immer
die Väter vor den Söhnen gespeichert werden, dann geht das beim Lesen
wieder ganz einfach: nächsten Knoten samt Vaternummer einlesen. Mit
einer Find-Funktion den Vater-Knoten im bisherigen Baum suchen und an
den wird dann der gerade gelesene Knoten angehängt.
Die Schreibroutine ist also eine einfache Rekursive Funktion, während
die Lese-Routine eine einfache Schleife darstellt, die jeden gelesenen
Knoten anhand der Vaternummer in den Baum wieder an der richtigen Stelle
einhängt.
Eine andere Möglichkeit wäre, wie Amateur schon angesprochen hat, die
Schreibroutine rekursiv auszuführen, wobei jeder Knoten auch die Anzahl
seiner Kinder mitspeichert (oder im Falle eines binären Baumes, dann
eben die Information, dass es dieses Kind nicht gibt). Dann kann man die
Leseroutine symetrisch dazu ebenfalls rekursiv ausführen.
Aber egal wie: Dreh und Angelpunkt besteht darin, dass die
Schreibroutine Zusatzinformation auf dem File ablegen muss, die den
Leseprozess leitet.