Mam listę elementów w hierarchii, a ja próbuję przeanalizować tę listę w rzeczywistą hierarchię obiektów. Używam modified pre-order tree traversal do przechowywania/iteracji za pomocą tej listy, więc to, co mam, to podzbiór drzewa, w tym wszystkie dzieci, uporządkowane według ich "lewej" wartości.Budowanie obiektów hierarchii z płaskiej listy elementów nadrzędnych/podrzędnych
Na przykład, ze względu na drzewo:
- Pozycja A
- Pozycja A.1
- Pozycja A.2
- Przedmiot A.2.2
- Pozycja B
- Przedmiot B.1
- Pozycja C
uzyskać listę:
- pkt a, pkt A.1, pkt A.2, Pozycja A.2.2, pozycja B, pozycja B.1, pozycja C
(Jest to w porządku "lewej" wartości ze zmodyfikowanego ustawienia drzewa zamówień przed zamówieniem).
Co chcę zrobić to przeanalizować to pod obiektami, które zawierają rzeczywistą strukturę drzewa, np:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
Lista płaskie zwracana jest jako lista TreeObjects - a każdy TreeObject ma właściwości ID , ParentID, Left i Right. To, czego szukam, to funkcja:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
, która przyjmuje listę płaską i zwraca listę zagnieżdżoną.
Innymi słowy:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Jestem w rozterce, jak to zrobić - śledzenie rodziców, i jest w stanie poradzić sobie z większym skoku (np, poz A.2.2 -> Przedmiot B).
Edycja: szukam rozwiązania niż brute-force tutaj (na przykład, nie zapętlenie kilka razy, przenosząc elementy do węzłów potomnych, dopóki istnieją tylko rodzice najwyższego poziomu w lewo). Zgaduję, że istnieje elegancka metoda, która może jednorazowo wykonać pętlę i po prostu umieścić elementy w razie potrzeby.
Pamiętaj, że są zawsze w porządku hierarchicznym (od kiedy używam MPTT), więc daną rzeczą zawsze będzie dziecko lub rodzeństwo poprzedniego przedmiotu, lub przynajmniej podzielenie się rodzicem z poprzednim przedmiotem . Nigdy nie pojawi się gdzie indziej w drzewie.
Czy to oznacza, że Twoje przechowywania parentId a lewy i prawy wartości dla każdego węzła w db? –