Die Basisklassenbibliothek in .NET verfügt über einige hervorragende Datenstrukturen für Sammlungen (Liste, Warteschlange, Stapel, Wörterbuch), enthält jedoch seltsamerweise keine Datenstrukturen für Binärbäume. Dies ist eine äußerst nützliche Struktur für bestimmte Algorithmen, z. B. solche, die unterschiedliche Durchquerungspfade nutzen. Ich suche eine korrekt geschriebene, kostenlose Implementierung.
Bin ich einfach blind und finde es nicht ... ist es irgendwo in der BCL begraben? Wenn nicht, kann jemand eine kostenlose oder Open-Source-C # /. NET-Bibliothek für Binärbäume empfehlen? Vorzugsweise eine, die Generika verwendet.
EDIT: Um zu klären, wonach ich suche. Ich bin nicht an geordneten Wörterbuchsammlungen interessiert, die intern einen Baum verwenden. Eigentlich interessiert mich ein Binärbaum - einer, der seine Struktur verfügbar macht, sodass Sie beispielsweise Teilbäume extrahieren oder die Knoten nach dem Fixieren durchlaufen können. Idealerweise könnte eine solche Klasse erweitert werden, um das Verhalten spezialisierter Bäume (z. B. Rot / Schwarz, AVL, Ausgeglichen usw.) bereitzustellen.
quelle
Antworten:
Du hast recht, es gibt nichts in der BCL. Ich vermute, dies liegt daran, dass die Wahl, ob ein Baum verwendet werden soll, in der Regel ein Implementierungsdetail darstellt und ansonsten eine unkonventionelle Methode für den Zugriff auf Daten darstellt. Das heißt, Sie sagen nicht "binäres Suchelement # 37"; Stattdessen sagst du "Hol mir Element Nr. 37".
Aber haben Sie sich C5 angesehen ? Es ist sehr praktisch und sie haben mehrere Baumimplementierungen ( 1 , 2 , 3 ).
quelle
Sie können Ihre eigenen definieren:
Oder ohne Schlüssel:
quelle
Was möchten Sie von einer solchen Implementierung?
Binärer Baum? Rot schwarz? Radixbaum? B-Baum? R-Baum? R * -Baum?
Ein Baum ist eher ein Muster als eine Datenstruktur und wird in der Regel dort verwendet, wo es auf die Leistung ankommt (daher sind wahrscheinlich auch Implementierungsdetails von Bedeutung). Wenn die BCL eine Art Baumklasse enthalten würde, müssten Sie sowieso nur Ihre eigene würfeln
quelle
Ich glaube das
SortedDictionary
beim Einfügen von log (n) Abrufmerkmale, die Sie von einer Baumdatenstruktur erwarten würden.http://msdn.microsoft.com/en-us/library/f7fta44c(VS.80).aspx
quelle
SortedSet<T>
wird als binärer Suchbaum ref implementiert .SortedDictionary<TKey, TValue>
intern verwendet,SortedSet<T>
so ist es auch ein binärer Suchbaum ref .quelle
Nein, es gibt keinen "
Tree<T>
ähnlichen" Typ in der BCL (was mich auch immer verwirrt hat), aber hier ist ein guter Artikel , der Sie durch die Implementierung Ihres eigenen in C # führt.Ich denke, Sie könnten das Argument vorbringen, dass baumbasierte Datenstrukturen in der Art von Anwendungen, für die .NET normalerweise verwendet wird (Geschäftsanwendungen, Apps zum Verschieben von Daten usw.), weniger häufig verwendet werden. Trotzdem stimme ich Ihnen zu, es ist seltsam, dass die BCL überhaupt keine Implementierung hat.
quelle
Diese Artikelserie war hilfreich für mich, als ich meine eigenen schreiben musste, insbesondere Teil 3 und 4.
Eine umfassende Untersuchung von Datenstrukturen
quelle
Es gibt einen TreeNode, den Sie verwenden können. Es ist nicht generisch und in Windows-Formularen versteckt und wird mit dem Treeview-Steuerelement verwendet. Sie können es jedoch auch an anderer Stelle verwenden.
quelle