Wie viele Traversalen müssen bekannt sein, um eine BST zu konstruieren

8

Ich bin sehr verwirrt über eine Reihe von Artikeln an verschiedenen Standorten bezüglich der Konstruktion eines Binary Search Tree von einem beliebigen traversalen ( pre , post oder in-order ) oder einer Kombination von zweien davon. Auf der Seite dieser Seite wird beispielsweise angegeben, dass bei der Auftragsdurchführung pre , post oder level zusammen mit dem in-order traversal kann man BST konstruieren. Aber hier und dort , zeigen sie uns, ein BST von pre-order allein zu konstruieren. Auch hier hier zeigen sie uns, wie man die BST von gegebenen pre und post-order Traversalen erstellt. In einer anderen Site habe ich eine Lösung gefunden, um ein BST nur aus dem post-order Traversal zu konstruieren.

Jetzt weiß ich, dass es mit den inorder und pre-order Traversalen möglich ist, ein BST eindeutig zu bilden. Was den ersten Link anbelangt, obwohl ich sage, dass wir BST nicht aus pre-order und post-order konstruieren können, kann ich nicht einfach das Array post-order sortieren, um dessen inorder traversal und dann benutze das und das Array pre-order , um BST zu bilden? Wird das gleiche wie die Lösung in der vierten Verbindung oder anders sein? Und wenn ich nur pre-order angegeben habe, kann ich das sortieren, um in-order zu erhalten, dann benutze das und pre-order , um das BST zu erhalten. Wiederum, muss das anders sein als die Lösung in den Links 2 und 3?

Was reicht aus, um BST eindeutig zu generieren? Wenn keine Eindeutigkeit erforderlich ist, kann ich sie einfach sortieren, um den in-order traversal zu erhalten und einen der N möglichen BST s daraus rekursiv aufzubauen.

    
SexyBeast 14.10.2012, 08:59
quelle

2 Antworten

13

Um eine BST zu konstruieren, brauchen Sie nur eine Traversierung (nicht in der Reihenfolge).

Um einen Binärbaum zu erstellen, benötigen Sie im Allgemeinen zwei Durchläufe, zum Beispiel in Reihenfolge und Vorbestellung. Für den speziellen Fall von BST - das Intra-Order-Traversal ist immer das sortierte Array, das die Elemente enthält, so dass Sie es immer rekonstruieren und einen Algorithmus verwenden können, um einen generischen Baum aus Vororder- und In-Order-Traversalen zu rekonstruieren. p>

Also ist die Information, dass der Baum eine BST ist, zusammen mit den Elementen darin (sogar ungeordnet) äquivalent zu einer In-Order-Traversierung.

Bonus: Warum ist eine Traversierung nicht genug für einen allgemeinen Baum (ohne die Information ist es eine BST)?
Antwort : Nehmen wir an, wir haben n distinct elements. Es gibt n! mögliche Listen für diese n Elemente, jedoch - die mögliche Anzahl von Bäumen ist viel größer (2 * n! Mögliche Bäume für die n Elemente sind alle verfallene Bäume, so dass node.right = null in jedem Knoten, also der Baum ist eigentlich eine Liste auf der rechten Seite.Es gibt n! solcher Bäume, und andere n! Bäume wo immer node.left = null ) Also, vom Taube-Loch-Prinzip gibt es mindestens eine Liste, die 2 Bäume generiert, also können wir nicht rekonstruiere den Baum aus einer einzigen Traversierung. (QED)

    
amit 14.10.2012, 09:14
quelle
0

Wenn die Werte für die Knoten der BST angegeben werden, ist nur eine Traversierung ausreichend, da der Rest der Daten durch die Werte der Knoten bereitgestellt wird. Aber wenn die Werte unbekannt sind, dann ist meines Erachtens das Konstruieren einer eindeutigen BST aus einer einzelnen Traversierung nicht möglich. Ich bin jedoch offen für Vorschläge.

    
Soumya Bhattacharjee 01.06.2017 05:05
quelle