pNodoA* Caso2 (pNodoA *a , int *ok) { pNodoA *ptu; ptu = a->dir; if (ptu->FB == -1) { // printf("fazendo rotacao esquerda em %s\n",a->palavra); a=rotacao_esquerda(a); } else { // printf("fazendo rotacao dupla esquerda em %s\n",a->palavra); a=rotacao_dupla_esquerda(a); } a->FB = 0; *ok = 0; return a; }
void insercao(parvore *raiz, tcod v) { parvore x, tio, avo; if ( (x = insere_no(raiz, v)) == NULL ) { return; } x -> cor = VERMELHO; while (x != (*raiz) && (x -> pai -> cor == VERMELHO )) { avo = x -> pai -> pai; if (x -> pai == avo -> esq) { tio = avo -> dir; if (tio -> cor == VERMELHO) { x -> pai -> cor = PRETO; tio -> cor = PRETO; avo -> cor = VERMELHO; x = avo; } else { // a cor do tio e negro if ( x == x -> pai -> dir) { // x, o filho direito de seu pai x = x -> pai; dica_da_rotacao(*raiz," esquerda "); rotacao_esquerda(&x, raiz); } x -> pai -> cor = PRETO; avo = x -> pai -> pai; avo -> cor = VERMELHO; dica_da_rotacao(*raiz, " direita "); rotacao_direita(&avo, raiz); } } else { // pai de x, o filho direito do avo de x.Este caso // semelhante ao anterior.Basta repetir o codigo acima // substituindo esq por dir tio = avo -> esq; if (tio -> cor == VERMELHO) { x -> pai -> cor = PRETO; tio -> cor = PRETO; avo -> cor = VERMELHO; x = avo; } else { if ( x == x -> pai -> esq) { // x, o filho direito // de seu pai x = x -> pai; dica_da_rotacao(*raiz, " direita "); rotacao_direita(&x, raiz); } x -> pai -> cor = PRETO; avo = x -> pai -> pai; avo -> cor = VERMELHO; dica_da_rotacao(*raiz, " esquerda "); rotacao_esquerda (&avo, raiz); } } } (*raiz) -> cor = PRETO; }