Esta respuesta combina algunos de mis comentarios a la pregunta y los expande.
La operación de subrango en árboles rojo-negros se puede realizar en el peor de los casos O (log n), donde n es el número de elementos en el árbol original. Dado que el árbol resultante compartirá algunos nodos con el árbol original, este enfoque es adecuado solo si los árboles son inmutables (o los árboles son mutables, pero el árbol original ya no es necesario).
Primero observe que la operación de subrango puede implementarse mediante dos operaciones divididas. Aquí la operación de división toma un árbol rojo-negro T y una tecla x y produce dos árboles L y R de modo que L consista en todos los elementos de T menores que x y R los elementos de T mayores que x. Por lo tanto, nuestro objetivo ahora es implementar la operación de división en árboles rojo-negros en el peor de los casos O (log n).
¿Cómo realizamos la operación de división en árboles rojo-negros en tiempo O (log n)? Bueno, resultó que había un método bien conocido. (No lo sabía, pero no soy un experto en estructuras de datos). Considere la operación de unión , que toma dos árboles L y R de tal manera que cada valor en L es menor que cada valor en R y produce un árbol que consiste en todos los valores en L y R. La operación de unión se puede implementar en el peor de los casos O (| r L −r R | +1), donde r L y r Rson los rangos de L y R, respectivamente (es decir, el número de nodos negros en el camino desde la raíz hasta cada hoja). La operación de división se puede implementar utilizando la operación de unión O (log n) veces, y el tiempo total en el peor de los casos sigue siendo O (log n) considerando una suma telescópica.
Las secciones 4.1 y 4.2 de un libro [Tar83] de Tarjan describen cómo implementar las operaciones de unión y división en árboles rojo-negros en el peor de los casos O (log n). Estas implementaciones destruyen árboles originales, pero es fácil convertirlos en implementaciones funcionales inmutables copiando nodos en lugar de modificarlos.
Como nota al margen, los módulos Set y Map de Objective Caml proporcionan la operación dividida, así como otras operaciones estándar en árboles de búsqueda binarios balanceados (inmutables). Aunque no usan árboles rojo-negros (usan árboles de búsqueda binarios balanceados con la restricción de que la altura izquierda y la altura derecha difieren en un máximo de 2), mirar sus implementaciones también podría ser útil. Aquí está la implementación del módulo Set .
Referencias
[Tar83] Robert Endre Tarjan. Estructuras de datos y algoritmos de red . Volumen 44 de la serie de conferencias regionales CBMS-NSF en matemáticas aplicadas , SIAM, 1983.