Алгоритм преобразования плоских иерархических данных (с 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

Я хотел бы перебирать элементы как можно меньше раз. Я также не хочу создавать иерархическую структуру данных. Я бы предпочел использовать массивы, хэши, стеки или очереди.

Две цели:

Сохраните хэш идентификатора до уровня отступа.Сортировка списка, который содержит все объекты в соответствии с их левыми значениями.

Когда я получаю список элементов, они не в определенном порядке. Братья и сестры должны быть упорядочены по их имени собственности.

Обновить: Может показаться, что я сам не пытался найти решение и просто хотел, чтобы другие делали эту работу за меня. Тем не менее, я попытался придумать три разных решения, и я застрял на каждом. Одной из причин может быть то, что я пытался избежать рекурсии (возможно, неправильно). Я не публикую частичные решения, которые у меня есть, поскольку они неверны и могут плохо влиять на решения других.

Ответы на вопрос(1)

Ваш ответ на вопрос