void balVP(arvore *A, arvore *no) { arvore *pai, *avo, *tio; pai = no->pai; while (pai->cor == 'V') { avo = pai->pai; if (no->raiz < avo->raiz) { // se for filho à esquerda if (avo->dir != NULL) // se o tio existir tio = avo->dir; if ((tio->cor == 'V')) { // caso 1 pai->cor = 'P'; tio->cor = 'P'; avo->cor = 'V'; no = avo; //faz nova avaliação no avô pai = no->pai; } else { if (no == pai->dir) { //se foi inserido a direita rotacaoEsq(pai); //caso 2 no = pai; pai = no->pai; } pai->cor = 'P'; // caso 3 avo->cor = 'V'; rotacaoDir(avo); } } else { if (avo->esq != NULL) tio = avo->esq; if ((tio->cor == 'V')) { pai->cor = 'P'; tio->cor = 'P'; avo->cor = 'V'; no = avo; pai = no->pai; } else { if (no == pai->esq) { rotacaoDir(pai); no = pai; pai = no->pai; } pai->cor = 'P'; avo->cor = 'V'; rotacaoEsq(avo); } } } A->dir->cor = 'P'; }
Arvore* balancearArvoreAVL(Arvore **no) { if ((*no) != NULL) { (*no)->balanceamento = calcularBalanceamento((*no)); if ((*no)->balanceamento >= 2) { (*no)->esq->balanceamento = calcularBalanceamento((*no)->esq); if ((*no)->esq->balanceamento > 0) { (*no) = rotacaoDir(no); } else { (*no) = rotacaoDuplaDir(no); } } else if ((*no)->balanceamento <= -2) { (*no)->dir->balanceamento = calcularBalanceamento((*no)->dir); if ((*no)->dir->balanceamento < 0) { (*no) = rotacaoEsq(no); } else { (*no) = rotacaoDuplaEsq(no); } } (*no)->esq = balancearArvoreAVL(&((*no)->esq)); (*no)->dir = balancearArvoreAVL(&((*no)->dir)); } return (*no); }