Разбор задачи: Обход N-арного дерева по предзаказу

Предложенный нами код решения:

 def preorder(root: Node) -> list[int]:
    """
    :param root: Корень n-арного дерева.
    :return: Список значений узлов в порядке их обхода (preorder traversal).
    """
    if not root:  # Если дерево пустое, возвращаем пустой список
        return []

    result = [root.val]  # Добавляем значение текущего узла
    for child in root.children or []:  # Рекурсивно обходим дочерние узлы
        result.extend(preorder(child))
    return result

Подробное описание работы функции

  1. Обработка пустого дерева:

    if not root:
        return []
    

    Если корень дерева (root) отсутствует, дерево считается пустым. В этом случае функция сразу возвращает пустой список, поскольку обрабатывать больше нечего.

  2. Добавление значения текущего узла:

    result = [root.val]
    

    Сначала в список result добавляется значение текущего узла (root.val), так как в прямом обходе текущий узел обрабатывается первым.

  3. Обход дочерних узлов:

    for child in root.children or []:
        result.extend(preorder(child))
    

    Если у текущего узла есть дочерние узлы (root.children), каждый из них рекурсивно передается в функцию preorder. Результат их обработки добавляется в список result с помощью extend.
    Выражение root.children or [] гарантирует, что если у узла нет детей (root.children == None), вместо этого будет использован пустой список.

  4. Возврат результата:

    return result
    

    После обхода всех узлов дерева возвращается итоговый список значений, полученных в порядке прямого обхода.


Пошаговый пример выполнения

Рассмотрим дерево:

         1
      /  |  \
     3   2   4
    / \
   5   6
  1. Начинаем с корня 1. В список result добавляется [1].
  2. Обрабатываем дочерние узлы корня:
    • Узел 3:
      • Добавляем значение 3 ([3]).
      • Рекурсивно обходим дочерние узлы 3: [5] и [6].
      • Результат для узла 3: [3, 5, 6].
    • Узел 2:
      • Добавляем значение 2 ([2]).
    • Узел 4:
      • Добавляем значение 4 ([4]).
  3. Объединяем результаты: [1] + [3, 5, 6] + [2] + [4] = [1, 3, 5, 6, 2, 4].

Итоговый результат обхода: [1, 3, 5, 6, 2, 4].

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии