Алгоритм преобразования плоских иерархических данных (с ParentID) в отсортированный плоский список с уровнями отступов
У меня есть следующая структура:
MyClass {
guid ID
guid ParentID
string Name
}
Я хотел бы создать массив, который содержит элементы в том порядке, в котором они должны отображаться в иерархии (например, в соответствии с их «левыми» значениями), а также хэш, который отображает направляющую на уровень отступа.
Например:
ID Name ParentID
------------------------
1 Cats 2
2 Animal NULL
3 Tiger 1
4 Book NULL
5 Airplane NULL
По сути, это приведет к созданию следующих объектов:
// 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
Для ясности, вот как выглядит иерархия:
Airplane
Animal
Cats
Tiger
Book
Я хотел бы перебирать элементы как можно меньше раз. Я также не хочу создавать иерархическую структуру данных. Я бы предпочел использовать массивы, хэши, стеки или очереди.
Две цели:
Сохраните хэш идентификатора до уровня отступа.Сортировка списка, который содержит все объекты в соответствии с их левыми значениями.Когда я получаю список элементов, они не в определенном порядке. Братья и сестры должны быть упорядочены по их имени собственности.
Обновить: Может показаться, что я сам не пытался найти решение и просто хотел, чтобы другие делали эту работу за меня. Тем не менее, я попытался придумать три разных решения, и я застрял на каждом. Одной из причин может быть то, что я пытался избежать рекурсии (возможно, неправильно). Я не публикую частичные решения, которые у меня есть, поскольку они неверны и могут плохо влиять на решения других.