Алгоритм преобразования дерева в таблицу #626127


#0 by akaBrr
Ищется сабж, без привязки к конкретному языку. Бросьтесь ссылкой, пожалуйста.
#1 by Irbis
плоская таблица с колонкой родитель, не?
#2 by Жан Пердежон
алгоритм обхода дерева? мде
#3 by akaBrr
минуту, сейчас попробую реализовать
#4 by akaBrr
вот такой я тупой, не жмитесь, делитесь знаниями
#5 by akaBrr
Цель, преобразовать xml файл произвольного вида(выгрузка документа) в таблицу
#6 by iceman2112
А как ты видишь таблицу для дерева: Р1  П1  П2  П3 Р2  П5    K8    K2  П6 ?
#7 by akaBrr
вижу так: Р1 П1 Р1 П2 Р1 П3 Р2 П5 К8 К2 Р2 П6
#8 by akaBrr
+ а если как в Р1 П1 Р1 П2 Р1 П3 Р2 П5 П5 К8 П5 К2 Р2 П6 утро, не проснулся еще :(
#9 by ДемонМаксвелла
#10 by Lama12
Варианта из должно хватить для восстановления из таблицы - дерева. Вариант из удобно читабелен человеку. Что нужно-то?
#11 by akaBrr
в идеале вариант , вот думаю из его можно как-то получить?
#12 by akaBrr
читал, не то, см.
#13 by Irbis
Можно но сначала придётся определить максимальный уровень вложенности, чтобы количество колонок определить
#14 by akaBrr
это сделать легко, опираясь на то что xml есть теги :), если тег содержит значение, то его используем как колонку в таблице, соответственно добавляем если колонки нет
#15 by akaBrr
+ проблема заполнить таблицу как в
#16 by akaBrr
или я просто туплю, простите
#17 by akaBrr
Пример: DS D  H   FC   FI   N  PS   P    C    A   P    C    A
#18 by akaBrr
Вижу как DS D H FC FI N PS P C A DS D H FC FI N PS P C A
#19 by akaBrr
Э, неудачный пример :(
#20 by Irbis
Если я правильно понял, тебе нужно добираться до "листочка" (ветки в которой нет больше ничего) и только такие листочки складывать в таблицу. А дальше сортировка
#21 by akaBrr
в ветка Н является "началом" ветки PS
#22 by akaBrr
+ и ветка PS лежит не в Н, а в D
#23 by Ursus maritimus
Цель какая этого действа? Перебрать строки циклом без рекурсии? Или что?
#24 by akaBrr
самое интересное что эксель так умеет
#25 by akaBrr
цель уложить в таблицу дерево, рекурсия или нет - пофигу
#26 by akaBrr
я так думаю, нужно установить связь между колонкой таблицы и путем по которому получается значение, получается двухпроходной алгоритм, сначала создаем колонки и фиксируем связи, потом заполняем таблицу
#27 by Ursus maritimus
Хорошо. Чем тебе дерево не таблица? Какие у таблицы свойства и методы, которых нет у дерева? Чего в дереве не хватает?
#28 by Irbis
Значит не понял, но тогда в 18 не содержится строк для отдельных листочков из веток верхнего уровня
#29 by akaBrr
ну у дерева разной длинны ветки, и в общем случае в узлах могут лежать не соответствующие друг другу данные, обсуждается дерево не из 1С 8
#30 by akaBrr
да, интересно как это микрософтовцы сделали
#31 by fedoss
Функция РазобратьУзел(ТекущийУзел, Уровень, ТЗ)    ТЗ.НоваяКолонка;    Уровень = Уровень + 1;    ВсегоДобавленоСтрок = 0;    Если ЕстьПодчиненныеУзлы Тогда        Для Каждого ПодчиненныйУзел Из ТекущийУзел Цикл            ДобавленоСтрок = РазобратьУзел(ПодчиненныйУзел, Уровень, ТЗ);            ВсегоДобавленоСтрок = ВсегоДобавленоСтрок + ДобавленоСтрок;        КонецЦикла        ТЗ.Заполнить(ЗначениеТекущегоУзла, ТЗ.КоличествоСтрок - ВсегоДобавленоСтрок + 1, ТЗ.КоличествоСтрок, Уровень);        Возврат ВсегоДобавленоСтрок;    Иначе        ТЗ.НоваяСтрока;        ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, Уровень, ЗначениеТекущегоУзла);        Возврат 1;    КонецЕсли; КонецФункции ТЗ = СоздатьОбъект("ТаблицаЗначений"); РазобратьУзел(Корень, 0, ТЗ);
#32 by akaBrr
класс, спасибо
#33 by GANR
Вот так нужно обходить дерево: СтекВызовов = Новый Массив;     СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ТвоеДерево.Строки, 0)); Пока СтекВызовов.Количество <> 0 Цикл    ТекущиеПараметры = СтекВызовов[СтекВызовов.Количество-1];    Если ТекущиеПараметры.Курсор <= ТекущиеПараметры.НаборСтрок.Количество - 1 Тогда        ДочернийНабор = ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].Строки;        ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1;        // здесь строить ТЗ        Если ДочернийНабор.Количество <> 0 Тогда                СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ДочернийНабор, 0));        КонецЕсли;    Иначе        СтекВызовов.Удалить(СтекВызовов.Количество-1);    КонецЕсли; КонецЦикла; Ну а как получить текущий и родительский узлы в точке "// здесь строить ТЗ" - придумайте сами :-).
#34 by GANR
+ Пардон, ТЗ надо строить перед строчкой "ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1; "
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С