Заполнить дерево значений (тестовое задание)

1. scientes 296 28.12.22 15:11 Сейчас в теме
В одной из публикаций на сайте встретилась задача преобразовать таблицу с колонками Родитель, Потомок в дерево значений. Сочинил следующий код:
Функция РекурсивноеПостроение(Знач вхРодитель,д,дз)
    приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
    для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
       вхРодитель=узел.Потомок;
      д.Удалить(узел);                     
      куда=приемник.Строки.Добавить();
      куда.Ч=вхРодитель;
      РекурсивноеПостроение(вхРодитель,д,дз)
   конеццикла;   
КонецФункции

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

возврат дз;
КонецФункции 
Показать

Существует ли более короткий код ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. пользователь 28.12.22 15:39
Сообщение было скрыто модератором.
...
5. пользователь 28.12.22 16:17
Сообщение было скрыто модератором.
...
3. soft_wind 28.12.22 15:57 Сейчас в теме
суть рекурсии? в том что от текущего элемента(строки) продолжаете обработку,
в вашем коде можно/нужно убрать поиск строки дерева, примерно так

&НаСервере
Процедура РекурсивноеПостроение(Знач вхРодитель,д,дз)
    //приемник=дз.Строки.Найти(вхРодитель,"Ч",Истина);
	приемник=дз;
    для каждого узел из д.НайтиСтроки(новый структура("Родитель",вхРодитель)) цикл
       вхРодитель=узел.Потомок;
      д.Удалить(узел);                     
      куда=приемник.Строки.Добавить();
      куда.Ч=вхРодитель;
      РекурсивноеПостроение(вхРодитель,д,куда);//дз);
   конеццикла;   
КонецПроцедуры
Показать
4. пользователь 28.12.22 16:01
Сообщение было скрыто модератором.
...
6. soft_wind 28.12.22 16:26 Сейчас в теме
(4) если родитель может стать потомком - придем к зацикливанию!
7. пользователь 28.12.22 16:32
Сообщение было скрыто модератором.
...
8. SlavaKron 28.12.22 16:49 Сейчас в теме
Классика. Только немного сбивает с толку слово "потомок". Имеется в виду же собственный идентификатор строки
Процедура СформироватьСтрокиДереваРекурсивно(ТаблицаЗначений, Строки, Родитель)
	
	МассивСтрок = ТаблицаЗначений.НайтиСтроки(Новый Структура("Родитель", Родитель));
	
	Для Каждого Стр Из МассивСтрок Цикл
		
		НоваяСтрока = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
		
		СформироватьСтрокиДереваРекурсивно(ТаблицаЗначений, НоваяСтрока.Строки, Стр.Потомок);
		
	КонецЦикла;
	
КонецПроцедуры
Показать
9. scientes 296 28.12.22 16:54 Сейчас в теме
(8) Вопрос, кто будет родителем для корневых строк, которые не встречаются в поле Потомок ?
10. SlavaKron 28.12.22 16:55 Сейчас в теме
(9) Пустое значение, очевидно. Если идентификатор число, то 0.
11. scientes 296 28.12.22 16:56 Сейчас в теме
(10) В исходной таблице таких строк нет. Корневая строка 10, для нее только две записи с подчиненными элементами.
12. пользователь 28.12.22 16:59
Сообщение было скрыто модератором.
...
13. SlavaKron 28.12.22 17:07 Сейчас в теме
(12) Ок, можно добить строками, для которых нет родителя. Это проще, мне кажется.
14. пользователь 28.12.22 17:09
Сообщение было скрыто модератором.
...
15. SlavaKron 28.12.22 17:10 Сейчас в теме
16. пользователь 28.12.22 17:13
Сообщение было скрыто модератором.
...
17. SlavaKron 28.12.22 17:16 Сейчас в теме
(16) Можно не добивать, объединив поиск корневых строк и заполнение дерева в одном цикле.
18. пользователь 28.12.22 17:26
Сообщение было скрыто модератором.
...
19. SlavaKron 28.12.22 17:31 Сейчас в теме
(18) Он не правильный с точки зрения рекурсии, так как мы повторяем код, который по сути уже есть в рекурсии.
Изначально мне трудно представить такие исходные данные.
Метод Найти, насколько знаю, не использует индексы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот