Создавайте результат внутри функции, не меняйте children и отделите логирование от обхода. Явный стек позволяет сохранить preorder, добавляя детей в обратном порядке.
Как сделать обход дерева понятным и без скрытого состояния?
Создавайте результат внутри функции, не меняйте children и отделите логирование от обхода. Явный стек позволяет сохранить preorder, добавляя детей в обратном порядке.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Функция обхода дерева записывает найденные id в глобальный массив result, мутирует children и одновременно выводит логи. Повторный вызов возвращает старые значения. Нужен preorder для конечного дерева без циклов, с сохранением порядка children. Предложите чистый вариант.
Ответ
Создавайте результат внутри функции, не меняйте children и отделите логирование от обхода. Явный стек позволяет сохранить preorder, добавляя детей в обратном порядке.
function preorder(root) {
const result = [], stack = root ? [root] : [];
while (stack.length) {
const node = stack.pop();
result.push(node.id);
const children = node.children ?? [];
for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]);
}
return result;
}
У каждого вызова собственные массивы, поэтому данные не накапливаются между запусками. Сложность O(N) по узлам; циклический граф требует другого контракта с visited. Побочные эффекты вроде логов можно выполнить над полученным результатом.