Что такое красно-черное дерево

Ответ

Красно-черное дерево — это самобалансирующееся бинарное дерево поиска, где каждый узел имеет дополнительный атрибут — цвет (красный или черный). Оно поддерживает баланс при вставке и удалении, гарантируя логарифмическую сложность операций.

Основные свойства:

  1. Каждый узел — либо красный, либо черный.
  2. Корень всегда черный.
  3. Все листья (NIL) — черные.
  4. У красного узла оба потомка черные.
  5. Пути от узла до любых листьев содержат одинаковое количество черных узлов.

Пример структуры узла:

class Node {
  constructor(value, color = 'RED') {
    this.value = value;
    this.left = null;
    this.right = null;
    this.parent = null;
    this.color = color;
  }
}

Балансировка достигается поворотами и перекрашиванием узлов при нарушениях свойств. Используется в реализациях TreeMap и TreeSet в Java, map и set в C++.

Ответ 18+ 🔞

Ну, слушай, вот есть такая штука — красно-черное дерево. Представь себе обычное бинарное дерево поиска, но с прикрученной, блядь, системой балансировки, чтобы оно не превращалось в кривую палку, на которую только бельё вешать. Каждый узел там, понимаешь, либо красный, либо чёрный, как на светофоре, только без жёлтого.

Основные правила, которые оно свято блюдёт, а иначе пиздец:

  1. Узел — либо красный, либо чёрный. Никаких полутонов, ёпта.
  2. Корень — всегда чёрный, как моя душа после дедлайна. Это аксиома.
  3. Все эти пустые листья (NIL) — тоже чёрные. Просто договорились так.
  4. Если узел красный — его детишки обязаны быть чёрными. Два красных подряд — это уже нарушение, как пьяный дебош в общежитии.
  5. А вот это самое хитрожопое правило: от любого узла до любого листа должно быть одинаковое количество чёрных узлов. Это чтобы все пути были примерно равны, и дерево не перекашивало на один бок.

Вот, смотри, как узел примерно выглядит в коде, чтоб ты понимал масштаб:

class Node {
  constructor(value, color = 'RED') {
    this.value = value;
    this.left = null;
    this.right = null;
    this.parent = null;
    this.color = color;
  }
}

А балансируют его, когда что-то вставляют или удаляют, с помощью поворотов и перекрашиваний. Представь, ты вставил узел — бац, правило №4 нарушилось, два красных рядом. Дерево такое: «Опа, щас всё починю!» — делает поворот, перекрашивает, и опять красота. Вся магия в этих операциях, они и не дают ему развалиться.

Используется эта конструкция, между прочим, в серьёзных местах — в TreeMap в Java, в map и set в C++. Там, где надёжность и скорость нужны, а не какой-нибудь костыль на один раз.