Упорядоченное дерево: поиск и вставка за O(log n).
⏱️ ~30 мин·Продвинутый·📚 2 урока
Бинарное дерево поиска
BST (Binary Search Tree) — бинарное дерево с правилом упорядочивания: для любого узла все значения слева меньше его, все справа — больше. Это правило позволяет искать как в бинарном поиске: на каждом шаге отбрасываем половину дерева. Поиск, вставка и удаление — в среднем O(log n).
Слева от 8 всё меньше, справа — больше. То же правило на каждом уровне.
▶ bst-search.py
Поиск идёт по одной ветке: сравнили с узлом и сразу решили, в какую половину спускаться. Для сбалансированного дерева высота ≈ log n, поэтому и поиск O(log n) — гораздо быстрее линейного перебора спискаИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list..
Вставка в BST
Вставка следует тому же правилу: спускаемся влево или вправо, пока не найдём пустое место, и подвешиваем новый узел туда. Так дерево остаётся упорядоченным.
▶ bst-insert.py
💡Совет
Важное свойство. In-order обход BST всегда выдаёт значения по возрастанию. Это любимый вопрос на собеседовании: «как проверить, что дерево — корректный BST?» — один из ответов: сделать in-order и убедиться, что список строго возрастает.
⚠️Осторожно
O(log n) у BST — это для сбалансированного дерева. Если вставлять уже отсортированные данные (1, 2, 3, 4...), дерево выродится в «список»: каждый узел только справа, высота n, а поиск — O(n). От этого спасают самобалансирующиеся деревья (AVL, красно-чёрные), но их устройство — тема продвинутого уровня.
▶ predict-degenerate.py
Высота окажется 5 — дерево превратилось в цепочку, потому что каждое следующее число больше предыдущего и уходит только вправо. Это наглядно показывает, почему важна сбалансированность.
⚠️ Частые ошибки новичков
Ошибка. При вставке забыть вернуть узел (return node) и не присвоить результат обратно (node.left = insert(...)). Тогда новые узлы «теряются» — дерево не меняется. Рекурсивная вставка должна возвращать поддерево и пере-привязывать его. Запустите сломанный код: дерево останется из одного узла.
▶ broken-insert.py
Заданиерешение.py
Напишите функцию search(node, target) для BST, возвращающую True/False, используя правило упорядочивания (не обходите всё дерево, спускайтесь по одной ветке).
Заданиерешение.py
Напишите функцию find_min(node), возвращающую минимальное значение в непустом BST. Подсказка: минимум — это самый левый узел.
❓Проверь себя
Какое правило задаёт BST?
Что даёт in-order обход корректного BST?
Почему поиск в BST может выродиться в O(n)?
ℹ️Важно
✅ Что вы узнали
BST: слева меньше узла, справа больше — поиск как бинарный.
Поиск и вставка в среднем O(log n).
Вставка возвращает поддерево и пере-привязывает его (node.left = insert(...)).
Комментарии
Загрузка…
Загрузка комментариев…