示例#1
0
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';
}
示例#2
0
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);
}