У меня есть список элементов в иерархии, и я пытаюсь разобрать этот список в фактическую иерархию объектов. Я использую modified pre-order tree traversal для хранения/повторения этого списка, и поэтому у меня есть подмножество дерева, включая всех детей, упорядоченное по их «левому» значению.Создание объектов иерархии из плоского списка parent/child
Например, если дерево:
- Пункт А
- Пункт A.1
- Пункт А.2
- Пункт A.2.2
- Пункт B
- Пункт B.1
- Пункт C
Я получаю список:
- Пункт А, пункт А.1, А.2 предмета, Пункт A.2.2, Пункт B, Пункт B.1, Пункт C
(Это в порядке «левого» значения из измененной настройки дерева предварительного заказа).
То, что я хочу сделать, это разобрать это в объекты, которые содержат фактическую структуру дерева, например:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
Плоский список возвращается в Список TreeObjects - и каждый TreeObject имеет свойства для ID , ParentID, Left и Right. То, что я ищу, является функцией:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
, который берет плоский список и возвращает список вложенных объектов.
Другими словами:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Я в недоумении, как это сделать - отслеживании родителей, и быть в состоянии иметь дело с большим скачком (например, пункт А.2.2 -> Пункт Б).
Edit: Я ищу не-перебор решения здесь (например, не зацикливание несколько раз, перемещение элементов в дочерние узлы, пока не только родители верхнего уровня слева). Я предполагаю, что есть элегантный метод, который может зацикливаться один раз и просто поместить элементы по мере необходимости.
Помните, что они всегда находятся в иерархическом порядке (поскольку я использую MPTT), поэтому данный элемент всегда будет дочерним или родственным из предыдущего элемента или, по крайней мере, разделяет родителя с предыдущим элементом , Он никогда не появится где-то еще в дереве.
Означает ли это ваше хранение ParentID и левые и правые значения для каждого узла в БД? – 2011-09-05 20:47:49