Заполнить дерево значений (тестовое задание)
В встретилась задача преобразовать таблицу с колонками Родитель, Потомок в дерево значений. Сочинил следующий код:
Существует ли более короткий код ?
Функция РекурсивноеПостроение(Знач вхРодитель,д,дз)
приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
вхРодитель=узел.Потомок;
д.Удалить(узел);
куда=приемник.Строки.Добавить();
куда.Ч=вхРодитель;
РекурсивноеПостроение(вхРодитель,д,дз)
конеццикла;
КонецФункции
Функция ПостроитьДерево() экспорт
//подготовка исходных данных
д=новый ТаблицаЗначений;
тЧисло=новый ОписаниеТипов("Число");
д.Колонки.Добавить("Потомок",тЧисло);
д.Колонки.Добавить("Родитель",тЧисло);
н=0;
для каждого запись из СтрРазделить("1,10,4,1,7,4,2,10,3,2,5,2,6,5",",") цикл
если н=0 тогда
приемник=д.Добавить();
приемник.Потомок=число(запись);
иначе
приемник.Родитель=число(запись);
конецесли;
н=(н+1)%2
конеццикла;
//код заполнения дерева
дз=новый деревозначений;
дз.Колонки.Добавить("Ч");
для каждого запись из д цикл
найти=д.Найти(запись.Родитель,"Потомок");
если найти=неопределено тогда //это корневой узел
приемник=дз.Строки.Добавить();
приемник.Ч=запись.Родитель;
РекурсивноеПостроение(приемник.Ч,д,дз)
конецесли;
конеццикла;
возврат дз;
КонецФункции
ПоказатьСуществует ли более короткий код ?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
суть рекурсии? в том что от текущего элемента(строки) продолжаете обработку,
в вашем коде можно/нужно убрать поиск строки дерева, примерно так
в вашем коде можно/нужно убрать поиск строки дерева, примерно так
&НаСервере
Процедура РекурсивноеПостроение(Знач вхРодитель,д,дз)
//приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
приемник=дз;
для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
вхРодитель=узел.Потомок;
д.Удалить(узел);
куда=приемник.Строки.Добавить();
куда.Ч=вхРодитель;
РекурсивноеПостроение(вхРодитель,д,куда);//дз);
конеццикла;
КонецПроцедуры
Показать
Классика. Только немного сбивает с толку слово "потомок". Имеется в виду же собственный идентификатор строки
Процедура СформироватьСтрокиДереваРекурсивно(ТаблицаЗначений, Строки, Родитель)
МассивСтрок = ТаблицаЗначений.НайтиСтроки(Новый Структура("Родитель", Родитель));
Для Каждого Стр Из МассивСтрок Цикл
НоваяСтрока = Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
СформироватьСтрокиДереваРекурсивно(ТаблицаЗначений, НоваяСтрока.Строки, Стр.Потомок);
КонецЦикла;
КонецПроцедуры Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот