Переробіть алгоритм побудови дерева.
Деякі вебфоруми мають деревоподібне компонування, тому дописи показуються як дерево. Проте зазвичай дописи зберігаються в базі даних як невпорядкована множина записів. Тож коли ми показуємо дописи користувачеві, структуру дерева доводиться відновлювати.
У цій вправі ми переробимо робочий, але повільний і негарний фрагмент коду, який реалізує логіку побудови дерева для сильно абстрагованих записів. Записи містять лише ID та ID батьківського запису. ID завжди лежить від 0 (включно) до довжини масиву записів (не включно). У всіх записів батьківський ID менший за їхній власний ID, крім кореневого запису, у якого батьківський ID дорівнює його власному ID.
Приклад дерева:
root (ID: 0, parent ID: 0)
|-- child1 (ID: 1, parent ID: 0)
| |-- grandchild1 (ID: 2, parent ID: 1)
| +-- grandchild2 (ID: 4, parent ID: 1)
+-- child2 (ID: 3, parent ID: 0)
| +-- grandchild3 (ID: 6, parent ID: 3)
+-- child3 (ID: 5, parent ID: 0)
Іноді виникає потреба викликати виняток. Коли ми це робимо, варто завжди додавати змістовне повідомлення про помилку, яке вказує, у чому причина помилки. Це робить код зрозумілішим і суттєво допомагає з налагодженням. Якщо відомо, що джерело помилки має певний тип, можна викликати один із вбудованих типів помилок, але повідомлення все одно має бути змістовним.
У цій вправі потрібно переробити те, як і де використовується інструкція raise, щоб «кинути» ValueError для некоректних вхідних даних дерева. Тести пройдуть лише за умови, що код і викличе відповідний exception, і додасть до нього відповідне повідомлення.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.