Как TreeMap в Java поддерживает сбалансированную структуру?

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

Ответ

TreeMap<K, V> в Java реализован на основе красно-черного дерева (Red-Black Tree) — самобалансирующегося бинарного дерева поиска (BST). Балансировка происходит автоматически при вставке и удалении элементов для поддержания логарифмической высоты дерева.

Правила красно-черного дерева:

  1. Каждый узел имеет цвет: красный или черный.
  2. Корень всегда черный.
  3. Листья (null-узлы) считаются черными.
  4. Два красных узла не могут быть смежными (красный узел не может иметь красного родителя или красного потомка).
  5. Путь от любого узла до каждого из его листьев содержит одинаковое количество черных узлов (свойство черной высоты).

Операции балансировки: При нарушении правил после вставки/удаления применяются преобразования:

  • Перекрашивание (Recoloring): Изменение цвета узлов.
  • Повороты (Rotations):
    • Левый поворот
    • Правый поворот

Пример вставки с балансировкой:

TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "A"); // Вставка корня (черный)
map.put(20, "B"); // Вставка красного узла -> правило 4 может нарушиться
map.put(30, "C"); // Может потребоваться поворот и перекрашивание
// Дерево автоматически перестроится, чтобы остаться сбалансированным.

Результат: Гарантированная временная сложность O(log n) для операций put(), get(), remove(), в отличие от несбалансированного BST, который может выродиться в список (O(n)).