Além dos pontos Macneils ...
Árvores preto-vermelho talvez sejam mais úteis diretamente, porque existem operações eficientes úteis que não são amplamente suportadas em implementações de bibliotecas padrão, como o C ++ std::map
(pelo menos AFAIK). As árvores vermelho-preto podem suportar "dividir" (cortar uma árvore em duas, uma contendo chaves menos do que uma chave especificada e uma contendo chaves maiores) e "join" (ao contrário, combinando uma árvore de chaves grandes com uma árvore de pequenas) chaves) podem ser feitas no tempo O (log n), mas se elas forem suportadas em bibliotecas de contêiner padrão, parece ser uma coisa bem oculta.
No entanto, "aumentar" estruturas de dados é comum. Um exemplo simples é adicionar informações de tamanho da subárvore aos nós em quase qualquer estrutura de dados em árvore para suportar a subscrição O (log n). Exemplos mais sofisticados incluem árvores de intervalo.
Depois de ter a idéia de aumentar as estruturas de dados, há muitas variações que podem ser úteis para aplicativos específicos - e muito poucas estão disponíveis pré-empacotadas como uma biblioteca. Estruturas de dados da biblioteca padrão existentes (por exemplo, comostd::map
) não podem ser aumentadas com a cópia do código-fonte e a modificação direta - você não pode aumentá-las usando parâmetros de modelo.
Obviamente, para desenvolver uma estrutura de dados aumentada, você precisa entender a estrutura de dados não aumentada subjacente.
As árvores AVL podem ser mais rápidas que as árvores vermelho-preto se você fizer muito mais pesquisas do que inserções / exclusões (e desde que você não precise dessas operações de divisão / junção), portanto, dependendo do aplicativo, elas podem ser uma boa base para aumentando.