Какая временная сложность у основных операций с деревьями?

«Какая временная сложность у основных операций с деревьями?» — вопрос из категории Алгоритмы и структуры данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сложность операций с деревьями кардинально зависит от того, сбалансировано дерево или нет.

Сводная таблица сложностей: Операция Сбалансированное дерево (AVL, Красно-черное) Несбалансированное дерево (вырожденное в список)
Поиск O(log n) O(n)
Вставка O(log n) O(n)
Удаление O(log n) O(n)
Обход (in-order, pre-order, post-order) O(n) (посещение всех узлов) O(n)

Почему такая разница? В сбалансированном дереве высота ~log₂(n), и на каждом шаге алгоритм отбрасывает половину поддерева. В вырожденном дереве (цепочке узлов) высота равна n.

Пример поиска в бинарном дереве поиска (BST) на PHP:

class BinarySearchTree {
    public $val;
    public ?BinarySearchTree $left = null;
    public ?BinarySearchTree $right = null;

    public function search(int $target): ?BinarySearchTree {
        $current = $this;
        while ($current !== null) {
            if ($target === $current->val) {
                return $current; // Найден
            }
            // Спускаемся в левое или правое поддерево
            $current = $target < $current->val ? $current->left : $current->right;
        }
        return null; // Не найден
    }
}
// В сбалансированном дереве цикл выполнится не более log n раз.

B-деревья и B+ деревья, используемые в файловых системах и СУБД (индексы), также имеют сложность O(log n) для операций поиска/вставки, но с очень низким коэффициентом (широкое ветвление), что минимизирует обращения к диску.