Программа курса:
Разбор задачи: Обход 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Подробное описание работы функции
Обработка пустого дерева:
if not root: return []Если корень дерева (
root) отсутствует, дерево считается пустым. В этом случае функция сразу возвращает пустой список, поскольку обрабатывать больше нечего.Добавление значения текущего узла:
result = [root.val]Сначала в список
resultдобавляется значение текущего узла (root.val), так как в прямом обходе текущий узел обрабатывается первым.Обход дочерних узлов:
for child in root.children or []: result.extend(preorder(child))Если у текущего узла есть дочерние узлы (
root.children), каждый из них рекурсивно передается в функциюpreorder. Результат их обработки добавляется в списокresultс помощьюextend.
Выражениеroot.children or []гарантирует, что если у узла нет детей (root.children == None), вместо этого будет использован пустой список.Возврат результата:
return resultПосле обхода всех узлов дерева возвращается итоговый список значений, полученных в порядке прямого обхода.
Пошаговый пример выполнения
Рассмотрим дерево:
1
/ | \
3 2 4
/ \
5 6
- Начинаем с корня
1. В списокresultдобавляется[1]. - Обрабатываем дочерние узлы корня:
- Узел
3:- Добавляем значение
3([3]). - Рекурсивно обходим дочерние узлы
3:[5]и[6]. - Результат для узла
3:[3, 5, 6].
- Добавляем значение
- Узел
2:- Добавляем значение
2([2]).
- Добавляем значение
- Узел
4:- Добавляем значение
4([4]).
- Добавляем значение
- Узел
- Объединяем результаты:
[1] + [3, 5, 6] + [2] + [4] = [1, 3, 5, 6, 2, 4].
Итоговый результат обхода: [1, 3, 5, 6, 2, 4].