Деревья бинарного поиска
Определение
Дерево бинарного поиска (Binary Search Tree, BST) — это разновидность бинарного дерева, обладающая следующим свойством
- Для каждого узла все значения в его левом поддереве меньше значения в самом узле, а все значения в правом поддереве больше значения в узле.
Это свойство также подразумевает, что значения в BST должны быть уникальными.
Пример дерева бинарного поиска
23
/ \
8 42
/ \ \
4 17 50
/ \
15 20
Операции и их сложность
В дереве бинарного поиска операции, такие как поиск, добавление и удаление, мог ут выполняться за O(log n) в среднем случае, где n — количество узлов в дереве. Это достигается благодаря использованию бинарного поиска.
Рассмотрим поиск значения 20 в приведённом дереве
- Начинаем с корня: 23 > 20, значит, игнорируем правое поддерево.
- Переходим в левое поддерево: 8 < 20, значит, игнорируем левое поддерево и двигаемся вправо.
- Следующий узел: 17 < 20, снова идём вправо.
- Наконец, находим 20.
Таким образом, поиск работает за O(log n) в среднем случае.
Худший случай
В худшем случае (например, если дерево представляет собой просто односвязный список, где у каждого узла только один дочерний элемент) сложность поиска может достигать O(n).
Дополнительный факт
Обход BST в порядке DFS (обход в глубину) с приоритетом "слева направо" (inorder traversal) обработает узлы в отсортированном порядке.
Задачи
https://leetcode.com/problems/range-sum-of-bst/description/
https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/
https://leetcode.com/problems/validate-binary-search-tree/description/
https://leetcode.com/problems/insert-into-a-binary-search-tree/description/
https://leetcode.com/problems/search-in-a-binary-search-tree/description/
https://leetcode.com/problems/all-elements-in-two-binary-search-trees/description/
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
https://leetcode.com/problems/delete-node-in-a-bst/description/