void InserirAux (ARVORE *arvore, NO *no) { /* Ajusta os NOS segundo suas cores ate estes nao violem nenhuma regra da Arvore Vermelha e Preta */ while (no->pai->cor == 'v') { if (no->pai == no->pai->pai->fesq) { NO *PTR_aux = no->pai->pai->fdir; if (PTR_aux->cor == 'v') { no->pai->cor = 'p'; PTR_aux->cor = 'p'; no->pai->pai->cor = 'v'; no = no->pai->pai; } else { /* Caso entre no "if" fara rotaçao dupla */ if (no == no->pai->fdir) { no = no->pai; RotacaoEsquerda (arvore, no); } no->pai->cor = 'p'; no->pai->pai->cor = 'v'; RotacaoDireita (arvore, no->pai->pai); } } else { NO *PTR_aux = no->pai->pai->fesq; if (PTR_aux->cor == 'v') { no->pai->cor = 'p'; PTR_aux->cor = 'p'; no->pai->pai->cor = 'v'; no = no->pai->pai; } else { if (no == no->pai->fesq) { no = no->pai; RotacaoDireita (arvore, no); } no->pai->cor = 'p'; no->pai->pai->cor = 'v'; RotacaoEsquerda (arvore, no->pai->pai); } } } arvore->raiz->cor = 'p'; }
void AlgoritmoDSW(Apontador *Dicionario) { Apontador *p; int nodecount; int i; for((*p)=Dicionario,nodecount=0;(*p)!=0;(*p)=(*p)->Dir,++nodecount) { while(RotacaoDireita(p)==1) { } } for(i=nodecount/2; i>0; i/=2 ) { int k; for((*p)=Dicionario,k=0;k<i;++k,(*p)=(*p)->Dir) { RotacaoEsquerda(p); } } }
void RemoverAux(ARVORE *arvore, NO *aux) { NO *aux_irm; /* Similarmente a Inserir, percorre a ARVORE em busca de incosistencias */ while (aux->cor == 'p' && aux != arvore->raiz) { if (aux == aux->pai->fesq) { aux_irm = aux->pai->fdir; if (aux_irm->cor == 'v') { aux_irm->cor = 'p'; aux->pai->cor = 'v'; RotacaoEsquerda(arvore, aux->pai); aux_irm = aux->pai->fdir; } if (aux_irm->fdir->cor == 'p' && aux_irm->fesq->cor == 'p') { aux_irm->cor = 'v'; aux = aux->pai; } else { if (aux_irm->fdir->cor == 'p') { aux_irm->fesq->cor = 'p'; RotacaoDireita(arvore, aux_irm); aux_irm = aux->pai->fdir; } aux_irm->cor = aux->pai->cor; aux->pai->cor = 'p'; aux_irm->fdir->cor = 'p'; RotacaoEsquerda(arvore, aux->pai); aux = arvore->raiz; } } else { aux_irm = aux->pai->fesq; if ( aux_irm->cor == 'v') { aux_irm->cor = 'p'; aux->pai->cor = 'v'; RotacaoDireita(arvore, aux->pai); aux_irm = aux->pai->fesq; } if ( aux_irm->fdir->cor == 'p' && aux_irm->fesq->cor == 'p') { aux_irm->cor = 'v'; aux = aux->pai; } else { if ( aux_irm->fesq->cor == 'p') { aux_irm->fdir->cor = 'p'; RotacaoEsquerda(arvore, aux_irm); aux_irm = aux->pai->fesq; } aux_irm->cor = aux->pai->cor; aux->pai->cor = 'p'; aux_irm->fdir->cor = 'p'; RotacaoDireita(arvore, aux->pai); aux = arvore->raiz; } } } aux->cor = 'p'; }