Как сделать обход дерева понятным и без скрытого состояния?

Создавайте результат внутри функции, не меняйте 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. Побочные эффекты вроде логов можно выполнить над полученным результатом.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее