Дерево — иерархическая структура из узлов. У дерева есть корень (верхний узел), у каждого узла — потомки. Бинарное дерево — то, где у узла не больше двух детей: left и right. Узлы без детей называют листьями. Деревья моделируют файловую систему, HTML-страницу (DOM), дерево решений.
Узел 1 — корень; 4, 5, 6 — листья (без детей).
▶ tree-node.py
Три обхода в глубину (DFS)
Обойти дерево — значит посетить все узлы. Обходы в глубину рекурсивны и различаются моментом, когда мы «посещаем» сам узел относительно его поддеревьев:
pre-order (прямой): узел → левое → правое.
in-order (симметричный): левое → узел → правое.
post-order (обратный): левое → правое → узел.
▶ dfs-traversals.py
Обход в ширину (BFS) по уровням
BFS посещает узлы уровень за уровнем: сначала корень, потом всех его детей, потом внуков. Реализуется очередью: достаём узел, печатаем, кладём в очередь его детей. Этот приём вы уже видели — очередь deque из модуля про структуры данных.
BFS: 1 → 2, 3 → 4, 5. Порядок по уровням.
▶ bfs.py
💡Совет
Предскажите вывод.ФункцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат.tree_height считает высоту дерева — длину самого длинного пути от корня до листа. Какова высота дерева из примера (корень 1, дети 2 и 3, у 2 — дети 4 и 5)?
▶ predict-height.py
Вернётся 3: путь 1 → 2 → 4 (или 1 → 2 → 5) содержит три узла. Высота считается рекурсивно: высота узла = 1 + максимум из высот поддеревьев, а пустое поддерево даёт 0.
⚠️ Частые ошибки новичков
Ошибка. Забыть проверку if node is None в рекурсивном обходе. Тогда при попытке обратиться к node.left у несуществующего узла будет AttributeError. База рекурсииПриём, при котором функция вызывает саму себя. Нужен базовый случай, чтобы вызовы завершились. для деревьев — всегда «пустой узел». Запустите код и добавьте проверку на None.
▶ broken-traversal.py
Заданиерешение.py
Напишите функцию count_nodes(root), возвращающую количество узлов в бинарном дереве. База: пустое дерево содержит 0 узлов.
Заданиерешение.py
Напишите функцию inorder(root), возвращающую список значений при симметричном (in-order) обходе: левое поддерево, узел, правое.
❓Проверь себя
Сколько детей максимум у узла бинарного дерева?
В каком порядке посещает узлы обход in-order?
Какая структура данных нужна для обхода дерева в ширину (BFS)?
ℹ️Важно
✅ Что вы узнали
Дерево — иерархия узлов; бинарное — не более двух детей.
DFS-обходы: pre-order, in-order, post-order — различие в моменте посещения узла.
Комментарии
Загрузка…
Загрузка комментариев…