Zunächst gehe ich davon aus, dass alle Elemente unterschiedlich sind. Keine Anzahl von Sequentialisierungen gibt Auskunft über die Form eines Baumes mit Elementen [3,3,3,3,3]
. Es ist natürlich möglich, einige Bäume mit doppelten Elementen zu rekonstruieren. Ich weiß nicht, welche netten ausreichenden Bedingungen vorliegen.
Wenn Sie die negativen Ergebnisse fortsetzen, können Sie einen Binärbaum nicht vollständig aus seinen Sequentialisierungen vor und nach der Bestellung neu erstellen. [1,2]
Vorbestellung, Nachbestellung [2,1]
muss 1
an der Wurzel haben, 2
kann aber entweder das linke Kind oder das rechte Kind sein. Wenn Sie sich nicht um diese Mehrdeutigkeit kümmern, können Sie den Baum mit dem folgenden Algorithmus rekonstruieren:
- Sei der Durchlauf vor der Bestellung und der Durchlauf nach der Bestellung. Wir müssen , und dies ist die Wurzel des Baumes.[x1,…,xn][yn,…,y1]x1=y1
- x2 ist das am weitesten links stehende Kind der Wurzel und ist das am weitesten rechts stehende Kind. Wenn , ist der Wurzelknoten unär; Verwenden Sie und , um den einzelnen Teilbaum zu erstellen.y2x2=y2[x2,…,xn][yn,…,y2]
- Ansonsten seien und die Indizes, so dass und . ist das Durchlaufen des linken Teilbaums vor der Bestellung, das des rechten Teilbaums und ähnlich das Durchlaufen nach der Bestellung. Der linke Teilbaum hat Elemente und der rechte Teilbaum hat Elemente. Für jeden Teilbaum einmal wiederholen.
Diese Methode verallgemeinert sich übrigens auf Bäume mit beliebiger Verzweigung. Ermitteln Sie mit einer beliebigen Verzweigung die Ausdehnung des linken Teilbaums und schneiden Sie die Elemente aus beiden Listen ab. Wiederholen Sie diesen Vorgang, um den zweiten Teilbaum von links abzuschneiden, und so weiter.j x 2 = y i y 2 = x j [ x 2 , … , x j - 1 ] [ xijx2=yiy2=xj[x2,…,xj−1][xj,…,xn]j−2=n−i+1i−2=n−j+1
j−2
Wie gesagt, ist die Laufzeit mit Worst Case (im Fall von zwei Kindern durchsuchen wir jede Listenlinie). Sie können wiederum , dass in , wenn man die Listen vorverarbeiten ein aufzubauen finite Map - Struktur von Elementwerten an Positionen in den Eingangslisten . Verwenden Sie auch ein Array oder eine finite Karte, um von Indizes zu Werten zu wechseln. Halten Sie sich an globale Indizes, damit rekursive Aufrufe die gesamte Zuordnung erhalten und einen Bereich als Argument verwenden, um zu wissen, wie verfahren werden soll.O(n2)Θ(n2)O(nlg(n))nlg(n)
Mit der Vorbestellungsüberquerung und der In-Order-Überquerung können Sie den Baum wie folgt neu :[x1,…,xn][z1,…,zn]
- Die Wurzel ist der Kopf des Vorbestellungsdurchlaufs .x1
- Sei der Index mit . Dann ist der Durchlauf in der richtigen Reihenfolge des linken Kindes und der Durchlauf in der richtigen Reihenfolge des rechten Kindes. Gemessen an der Anzahl der Elemente ist der Durchlauf der Vorbestellung des linken Kindes und des rechten Kindes. Verwenden Sie diese Option, um die linken und rechten Teilbäume zu erstellen.z k = x 1 [ z 1 , … , z k - 1 ] [ z k + 1 , … ,kzk=x1[z1,…,zk−1][ x 2 , … , x k ] [ x k + 1 , … , x n ][zk+1,…,zn][x2,…,xk][xk+1,…,xn]
Wieder ist dieser Algorithmus wie angegeben und kann in wenn die Liste in einer endlichen Karte von Werten zu Positionen vorverarbeitet wird.O ( nO(n2)O(nlg(n))
Post-Order plus In-Order ist natürlich symmetrisch.