Algorithmus zum Konvertieren hierarchischer Flat-Daten (mit ParentID) in sortierte Flat-Listen mit Einrückungsstufen

Ich habe die folgende Struktur:

MyClass {
  guid ID
  guid ParentID
  string Name
}

Ich möchte ein Array erstellen, das die Elemente in der Reihenfolge enthält, in der sie in einer Hierarchie angezeigt werden sollen (z. B. entsprechend ihren "linken" Werten), sowie einen Hash, der die Guid der Einrückungsebene zuordnet.

Beispielsweise

ID     Name     ParentID
------------------------
1      Cats     2
2      Animal   NULL
3      Tiger    1
4      Book     NULL
5      Airplane NULL

Dies würde im Wesentlichen die folgenden Objekte erzeugen:

// Array is an array of all the elements sorted by the way you would see them in a fully expanded tree
Array[0] = "Airplane"
Array[1] = "Animal"
Array[2] = "Cats"
Array[3] = "Tiger"
Array[4] = "Book"

// IndentationLevel is a hash of GUIDs to IndentationLevels.
IndentationLevel["1"] = 1
IndentationLevel["2"] = 0
IndentationLevel["3"] = 2
IndentationLevel["4"] = 0
IndentationLevel["5"] = 0

Zur Verdeutlichung sieht die Hierarchie folgendermaßen aus:

Airplane
Animal
  Cats
    Tiger
Book

Ich möchte die Elemente so oft wie möglich durchlaufen. Ich möchte auch keine hierarchische Datenstruktur erstellen. Ich würde lieber Arrays, Hashes, Stapel oder Warteschlangen verwenden.

Die beiden Ziele sind:

Speichern Sie einen Hash der ID in der Einrückungsstufe.Sortieren Sie die Liste, die alle Objekte enthält, nach ihren linken Werten.

Wenn ich die Liste der Elemente erhalte, sind sie in keiner bestimmten Reihenfolge. Geschwister sollten nach ihrer Namenseigenschaft bestellt werden.

Aktualisieren Das mag so aussehen, als hätte ich nicht selbst versucht, eine Lösung zu finden, und möchte einfach, dass andere die Arbeit für mich erledigen. Ich habe jedoch versucht, drei verschiedene Lösungen zu finden, und bin bei jeder festgefahren. Ein Grund könnte sein, dass ich versucht habe, eine Rekursion zu vermeiden (vielleicht zu Unrecht). Ich veröffentliche die Teillösungen, die ich bisher habe, nicht, da sie falsch sind und die Lösungen anderer möglicherweise stark beeinflussen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage