Целью задания является разработка программы для обработки данных, организованных в древовидную структуру и проверка кандидата на знание основ типизации в языке typescript.
Класс, возвращающий информацию о дереве, находится в файле TreeData. Каждый узел представляет собой реализацию TreeNode.
Описание полей узла:
id
-id
узла в дереве. Является уникальнымparentId
-id
узла-родителя в деревеvalue
- Значение, используемое при вычисленияхaddValueCondition
- Флаг-условие, отображающий перенос значения или его начислениеvalueToParent
- Значение, которое должно быть начислено вышестоящим узлам дерева в зависимости от условияincrementValueCondition
context
- Контекст, используемый при вычислениях
Для установки зависимостей нужно выполнить npm i
в корне проекта
Для запуска проекта используется команда npm run start
- Разработайте реализацию интерфейса ITreeWalker
Описание методов:
init
- Инициализирует класс списком узлов дереваreverseWalk
- Выполняет обход дерева в ширину снизу вверх, вызывая функцию-обработчик для каждого из узлов дерева (Обход происходит по уровням дерева, начиная с самого нижнего)
- Разработайте реализацию интерфейса ITreeNodeHandler
Класс должен реализовывать метод
handleNode
, который работает по следующему алгоритму:
- Метод принимает узел дерева и его родителя, работа с массивом
children
у узлов в обработчике не допускается - Если для узла выполняется условие
addValueCondition == true
, то в егоvalue
должна быть сумма значенийvalueToParent
всех его детей - Если для узла выполняется условие
addValueCondition == false
, то всеvalueToParent
его детей должны быть отправлены родителю, как иvalueToParent
самого узла - Если у родителя
addValueCondition == false
, то значения перемещаются еще выше - Если для узла значение
value
было записано, то родителю должно быть отправлено только значениеvalueToParent
от текущего узла
Для реализации описанного функционала можно использовать контекст TreeNode
, который позволяет хранить любой заранее объявленный тип данных
- Можно использовать любые программные инструменты разработки (библиотеки/npm пакеты, IDE, версии Node.js и т.п.), разрабатывать на любой платформе
- Допускается добавление любых типов/файлов, но для изменения доступен только файл main.ts
- Необходима строгая типизация всего написанного кода
- Ориентировочное предполагаемое время на выполнение задания - 40-60 минут
- Данные задания не являются обязательными, однако позволяет более точно определить квалификацию специалиста, что положительно влияет на оценку профессиональных навыков
Отображение дерева до запуска обработчика:
Node 1 - condition: false, value: 0, valueToParent: 10
| Node 2 - condition: true, value: 0, valueToParent: 10
| | Node 4 - condition: true, value: 0, valueToParent: 10
| | | Node 5 - condition: true, value: 0, valueToParent: 10
| | | Node 8 - condition: false, value: 0, valueToParent: 10
| | | | Node 9 - condition: true, value: 0, valueToParent: 10
| | | | Node 12 - condition: true, value: 0, valueToParent: 10
| | | Node 11 - condition: true, value: 0, valueToParent: 10
| Node 3 - condition: true, value: 0, valueToParent: 10
| | Node 6 - condition: false, value: 0, valueToParent: 10
| | | Node 7 - condition: false, value: 0, valueToParent: 10
| | | | Node 10 - condition: true, value: 0, valueToParent: 10
Отображение дерева после запуска обработчика
Node 1 - condition: false, value: 0, valueToParent: 10
| Node 2 - condition: true, value: 10, valueToParent: 10
| | Node 4 - condition: true, value: 50, valueToParent: 10
| | | Node 5 - condition: true, value: 0, valueToParent: 10
| | | Node 8 - condition: false, value: 0, valueToParent: 10
| | | | Node 9 - condition: true, value: 0, valueToParent: 10
| | | | Node 12 - condition: true, value: 0, valueToParent: 10
| | | Node 11 - condition: true, value: 0, valueToParent: 10
| Node 3 - condition: true, value: 30, valueToParent: 10
| | Node 6 - condition: false, value: 0, valueToParent: 10
| | | Node 7 - condition: false, value: 0, valueToParent: 10
| | | | Node 10 - condition: true, value: 0, valueToParent: 10