Все статьи и конспекты
BSTКрасно-черные деревьяRBTДеревья
2 мин чтение

Двоичные деревья поиска (BST) и Красно-чёрные деревья (RBT)

Операции на BST: поиск, вставка, удаление элемента (3 случая), поиск предшественника и преемника. Красно-чёрные деревья: 5 инвариантов, левые и правые повороты, балансировка и строгая гарантия высоты h <= 2 log2(N+1).

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

1. Двоичное дерево поиска (BST)

Свойство BST: Для любого узла xx, ключи в левом поддереве ≤x.key\le x.key, а ключи в правом поддереве ≥x.key\ge x.key.

Удаление узла zz из BST (3 случая):

  • zz — лист: просто удаляем ссылку у родителя;
  • zz имеет одного потомка: замещаем zz его потомком;
  • zz имеет двух потомков: находим следующего по порядку узла yy (inorder successor — минимум в правом поддереве), копируем его ключ в zz, и удаляем yy.

  • 2. Красно-чёрное дерево (Red-Black Tree)

    Красно-чёрное дерево — сбалансированное двоичное дерево поиска, гарантирующее высоту h≤2log⁡2(n+1)h \le 2 \log_2(n + 1) за счет 5 свойств:

  • Каждый узел либо красный, либо чёрный;

  • Корень дерева всегда чёрный;

  • Все листья (NIL) — чёрные;

  • Если узел красный, оба его потомка чёрные (нет двух красных подряд);

  • Для каждого узла все простые пути от него до листьев содержат одинаковое число чёрных узлов (чёрная высота bh(x)bh(x)).
  • cpp
    // Левый поворот вокруг узла x
    void leftRotate(Node*& root, Node* x) {
        Node* y = x->right;
        x->right = y->left;
        if (y->left != nullptr) y->left->parent = x;
        y->parent = x->parent;
        if (x->parent == nullptr) root = y;
        else if (x == x->parent->left) x->parent->left = y;
        else x->parent->right = y;
        y->left = x;
        x->parent = y;
    }

    Что дальше?

    Вернитесь к обучению и выберите следующий материал.

    Изучено — к обучению →

    Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».