Проблема, которую я вижу, состоит в том, что вставка большого интервала может уничтожить большой кусок дерева, затрудняя восстановление красно-черных инвариантов.
Я думаю, что было бы проще использовать Splay Tree следующим образом. Для простоты каждое дерево содержит двух часовых: интервал A
слева от всех остальных интервалов и интервал Z
справа. Вставляя интервал I
, добавьте предшественника I
в H
к корню дерева. Дерево выглядит как
H
/ \
... X
/ \
... ...
Теперь отсоедините X
и добавьте преемника I
к корню J
.
H J
/ / \
... ... ...
В этот момент все интервалы, которые перекрывают I
, находятся в левом поддереве J
. Отсоедините это поддерево и поместите все его узлы в свободный список, расширяя I
, если это необходимо. Сделайте I
родителем H
и J
I
/ \
H J
/ \
... ...
и продолжаем наш веселый путь. Эта операция амортизируется за O (log n), где n - количество узлов дерева (это можно проверить, изучив потенциальную функцию дерева сплайнов и выполнив много алгебры).
Я должен добавить, что существует естественное рекурсивное слияние деревьев с деревьями путем вставки корня одного дерева и последующего слияния левого и правого поддеревьев. Я не знаю, как анализировать это по своему усмотрению.