Wie kann man einen binären Baum in ein Array umwandeln und wieder in ursprünglicher Form zurück?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Meiner Meinung nach liegt der Knackpunkt in der Array-Repräsentation des bin. Baumes, die sicherlich ohne zusätzliche Hilfsarrays, die parent-Referenzen o.ä. enthalten, auskommen soll.

So etwas habe ich hier gefunden: http://www.cogs.susx.ac.uk/courses/dats/notes/html/node79.html

Der Baum wird also mit dem breadth-first-Verfahren traversiert und im Array abgelegt.

Aus dem Array wird der bin. Baum durch die übliche insert-Methode rekonstruiert.

.
Oder habe ich etwas übersehen? Weil nur scharf nachgedacht und nicht mit Programm getestet...


giga4meyou 
Beitragsersteller
 29.06.2010, 21:59

Ist das breadth-first-Verfahren das gleiche wie Inorder ( http://de.wikipedia.org/wiki/In-order ) wenn ja geht es so nicht.

0
giga4meyou 
Beitragsersteller
 29.06.2010, 22:31
@greyhead

Ne, dass geht leider auch nicht, habe ich auch schon probiert.

0
greyhead  29.06.2010, 22:35
@giga4meyou

Hmmm. Muss ja ein komischer Baum sein. Ist er vielleicht nur von der Form her binär? Und die Schlüssel im linken Unterbaum nicht immer kleiner bzw. im rechten Unterbaum nicht immer größer?

0
giga4meyou 
Beitragsersteller
 29.06.2010, 23:55
@greyhead

Ach sory, habe ich ganz vergessen zu sagen es handelt sich um einen binären Suchbaum. Also es trifft genau zu was du gesagt hast. Wobei nicht alle Knoten(auch innere Knoten) vollständig ausgefüllt sein müssen.

0
greyhead  14.07.2010, 14:42
@greyhead

Oh, ein Jubiläumsstern (mein 50.) für eine interessante Frage. Vielen Dank.

0

BinBaum -> Array: Durchlaufe den binären Suchbaum mit dem Breitendurchlauf. In dieser Reihenfolge kopierst bzw. verweist du die Knoten aufsteigend in das Array. Der Baum wird sozusagen "eingerollt" von links nach rechts, zeilenweise.

Array -> BinBaum: Durchlaufe das Array iterativ vom Anfang bis Ende. Baue den binären Baum sukzessive durch eine einfache insert-Operation wieder auf. Der Baum wird wieder "aufgerollt", indem die Knoten ähnlich dem Breitendurchlauf in den Baum eingefügt werden. Es ergibt sich inbesondere die alte, selbe Anordnung der Knoten.

Beziehung parent node und child node im Array:

rank(linkerSohn) = 2 * rank(Vater)

rank(rechterSohn) = 2 * rank(Vater) + 1

wobei gilt: rank = array_index + 1

Kann man z.B. durch Rekursion lösen. Oder suche mal nach Implementierungen von Iteratoren.

Noch ein Hinweis beim Weg zurück vom Array zum Binärbaum: Die Einfüge-Reihenfolge ist wichtig.


giga4meyou 
Beitragsersteller
 29.06.2010, 19:13

Soweit bin ich auch schon!

0
giga4meyou 
Beitragsersteller
 29.06.2010, 23:57
@hoehlenknarf

ahm.. das ist glaube ich nur die Implementierung eines binären Baums mittels verketteten Listen und nicht das die Wandlung eines Baums in einen Array. ( Es handelt sich um einen binären Suchbaum)

0
giga4meyou 
Beitragsersteller
 29.06.2010, 23:59
@hoehlenknarf

sory fürs frech sein, deine erste Antwort wusst ich eben schon und es kam mir so vor als ob es klar wäre.

Mea Culpa

0

Da brauchst du nicht lange zu denken. Davon ausgehend, dass du eine zweidimensionale Tabelle verwendest, musst du eine logische Verbindung von Binärebene zum Tabellen-Zugriff erstsellen. Möglicherweise geht das über einen Schlüssel im Content, der in eine Zielkoodinate umgewandelt werden kann. Das ist vielfach nicht der Fall. Deswegen bleibt nur die Aufnumerierung jeder Ebene auf die Tabelle zu übertragen. Mit dieser kannst du dann beim Rückschreiben wieder den Baum mittels Gruppenbruch erstellen. zB. 1 10 101 102 11 110 12 etc. etc.