Проверяет понимание временной сложности операций в бинарном дереве поиска и факторов, влияющих на неё.
Бинарное дерево поиска (BST) — это структура данных, где для каждого узла все значения в левом поддереве меньше, а в правом — больше. Благодаря этому свойству поиск элемента напоминает двоичный поиск: на каждом шаге мы отбрасываем половину оставшихся узлов.
Время работы зависит от высоты дерева. Если дерево сбалансировано, его высота примерно равна log2(n), поэтому каждая операция (поиск, вставка, удаление) занимает O(log n). Это очень быстро даже для миллионов элементов.
Если вставлять элементы в отсортированном порядке, дерево превращается в цепочку — каждый узел имеет только одного потомка. Тогда высота становится n, и операции выполняются за O(n). Это эквивалентно линейному поиску в массиве.
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
function search(root, target) {
if (!root) return null;
if (root.value === target) return root;
if (target < root.value) return search(root.left, target);
return search(root.right, target);
}
// В сбалансированном дереве вызов search занимает O(log n)Используются самобалансирующиеся деревья: AVL-деревья, красно-чёрные деревья, B-деревья. Они автоматически корректируют структуру после вставки или удаления, сохраняя высоту O(log n). В стандартных библиотеках языков (например, TreeMap в Java, std::map в C++) реализованы именно такие деревья.
Время работы дерева поиска — O(log n) в среднем и при балансировке, но O(n) в худшем случае без неё. Применяйте BST, когда нужны быстрые операции поиска, вставки и удаления с упорядоченными данными, но обязательно используйте сбалансированные варианты для гарантии производительности.