Создайте TreeView только из родительской информации - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь построить дерево. Единственная информация, которую я имею для каждого элемента, - это идентификатор родителя, к которому он обращается.

У меня есть три разные записи:

Type TRecord1 = Record
                  ID            : Integer;                
                  Name          : String255;
                  Res           : Array[1..500] Of Byte;
                 End;

//------------------------------------------------------------------------------

Type TRecord2 = Record
                   ID            : Integer;                   
                   Parents       : Array [0..4] of Integer; 
                   Customer      : String100;
                   Res           : Array[1..500] Of Byte;
                 End;

//------------------------------------------------------------------------------

Type TRecord3 = Record
                   ID            : Integer;                   
                   Parents       : Array [0..4] of Integer; 
                   Datas         : String20;
                   Res           : Array[1..500] Of Byte;
                 End;

Для хранилища данных: у меня есть один файл для одного вида Записи, в которых хранятся все данные этой записи

Запись1 всегда не имеет родителя. У Record2 и Record3 всегда есть по крайней мере 1 родитель (максимум 5 => родительский массив)

enter image description here

Record2 может быть родителем Record2, т. Д .. Между ними нет никакой иерархии, кроме Record1, который всегда является root узлом.

Как можно эффективно построить связанное древовидное представление?

Я могу сначала построить узлы Record1, которые будут быть первыми узлами дерева. Затем для каждого из этого узла я должен найти Record2 из Record3, связанный с этим узлом, ect, ect ... Кажется, это займет слишком много времени.

Есть идеи создать дерево другим способом?

На данный момент я сохраняю TreeView в текстовом файле и создаю связь между узлом и связанной записью. Но я хочу создать TreeView из данных вместо TreeView в одной стороне и данных в другой стороне

1 Ответ

0 голосов
/ 08 апреля 2020

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

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

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

Но, поскольку вы Если у вас есть записи, в которых может быть несколько родителей, возможно, вы столкнетесь со сценарием, в котором один из родителей из вашей текущей записи ссылается на другую запись, которую вы еще не добавили в свое дерево.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...