I ont la structure suivante:algorithme pour convertir des données plates hiérarchiques (p/ParentID) dans la liste plate triés w/niveaux d'indentation
MyClass {
guid ID
guid ParentID
string Name
}
je voudrais créer un tableau qui contient les éléments dans l'ordre ils devraient être affichés dans une hiérarchie (par exemple en fonction de leurs valeurs "à gauche"), ainsi qu'un hachage qui mappe le guid au niveau d'indentation.
Par exemple:
ID Name ParentID
------------------------
1 Cats 2
2 Animal NULL
3 Tiger 1
4 Book NULL
5 Airplane NULL
Ce serait essentiellement produire les objets suivants:
// 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
Pour plus de clarté, voici ce que la hiérarchie ressemble:
Airplane
Animal
Cats
Tiger
Book
I'D aime à parcourir les articles le moins de fois possible. Je ne veux pas non plus créer une structure de données hiérarchique. Je préfère utiliser des tableaux, des hachages, des piles ou des files d'attente.
Les deux objectifs sont les suivants:
- magasin un hachage de l'ID au niveau de retrait.
- Triez la liste contenant tous les objets en fonction de leurs valeurs de gauche.
Lorsque j'obtiens la liste des éléments, ils ne sont pas dans un ordre particulier. Les frères et sœurs doivent être classés par leur propriété Name.
Mise à jour: Cela peut paraître comme si je n'avais pas essayé de trouver moi-même une solution et que je voulais simplement que les autres fassent le travail pour moi. Cependant, j'ai essayé de trouver trois solutions différentes, et je me suis retrouvé coincé sur chacune d'entre elles. Une raison pourrait être que j'ai essayé d'éviter la récursivité (peut-être à tort). Je ne publie pas les solutions partielles que j'ai jusqu'à présent car elles sont incorrectes et peuvent influencer les solutions des autres.
Les données récursives nécessitent des solutions récursives. Ils sont la seule raison pour laquelle des solutions récursives existent. – Smandoli
La récursivité n'est pas toujours requise, voir ma réponse. – Senseful