Además de los puntos de Macneils ...
Los árboles rojo-negros son quizás más útiles directamente porque existen operaciones útiles y eficientes que no son ampliamente compatibles con implementaciones de bibliotecas estándar como C ++ std::map(al menos AFAIK). Los árboles rojo-negros pueden soportar "dividir" (cortar un árbol en dos, uno que contenga claves menores que una clave especificada y otro que contenga claves mayores) y "unir" (al revés, combinar un árbol de claves grandes con un árbol de pequeñas teclas) se pueden hacer ambas en tiempo O (log n), pero si se admiten en bibliotecas de contenedores estándar, parece ser algo bien oculto.
Sin embargo, "aumentar" las estructuras de datos es común. Un ejemplo simple es agregar información del tamaño del subárbol a los nodos en casi cualquier estructura de datos de árbol para admitir la suscripción de O (log n). Ejemplos más sofisticados incluyen árboles de intervalos.
Una vez que tenga la idea de aumentar las estructuras de datos, hay muchas variaciones que pueden ser útiles para aplicaciones particulares, y muy pocas están disponibles preempaquetadas como una biblioteca. Las estructuras de datos de la biblioteca estándar existentes (p. Ej., Por ejemplo std::map) no se pueden aumentar antes de copiar el código fuente y modificarlo directamente; no puede aumentarlas utilizando parámetros de plantilla.
Por supuesto, para desarrollar una estructura de datos aumentada, debe comprender la estructura de datos no aumentada subyacente.
Los árboles AVL pueden ser más rápidos que los árboles rojo-negros si realiza muchas más búsquedas que inserciones / eliminaciones (y siempre que no necesite esas operaciones de división / unión), por lo que, según la aplicación, pueden ser una base muy buena para aumentando.