Что такое саморегулируемое (самобалансирующееся) дерево поиска?

«Что такое саморегулируемое (самобалансирующееся) дерево поиска?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Саморегулируемое дерево поиска (self-balancing binary search tree) — это бинарное дерево поиска (БДП), которое автоматически поддерживает свою высоту (глубину) близкой к логарифмической от числа узлов (O(log n)) после операций вставки или удаления.

Зачем это нужно? Обычное БДП может выродиться в связный список (высота O(n)) при последовательной вставке отсортированных данных, что сводит эффективность операций поиска, вставки и удаления к O(n). Балансировка гарантирует эффективность O(log n).

Основные типы и их свойства: Тип дерева Правило балансировки Сложность операций Применение
AVL-дерево Жёсткий баланс: разница высот левого и правого поддеревьев (balance factor) любого узла равна -1, 0 или 1. O(log n) Там, где частые операции поиска критичны (словари, кэши).
Красно-чёрное дерево Более мягкие правила (цвет узлов, свойства путей). Допускает большую несбалансированность, чем AVL. O(log n) Реализация TreeMap, TreeSet в Java, ассоциативные массивы.
Splay-дерево Балансируется при доступе к узлу (перемещает его в корень). Амортизированная O(log n). Амортизированная O(log n) Кэши, сборщики мусора.

Пример структуры узла для AVL-дерева на Java:

class AVLNode {
    int key, height;
    AVLNode left, right;

    AVLNode(int key) {
        this.key = key;
        this.height = 1; // Высота нового листа = 1
    }

    // Метод для пересчёта высоты узла
    void updateHeight() {
        this.height = 1 + Math.max(
            (left == null ? 0 : left.height),
            (right == null ? 0 : right.height)
        );
    }

    // Получение фактора баланса
    int getBalanceFactor() {
        return (left == null ? 0 : left.height) - (right == null ? 0 : right.height);
    }
}

Применение: Базы данных (индексы), файловые системы, реализация упорядоченных коллекций в стандартных библиотеках.