aula 304

Como implementar uma ROTAÇÃO À DIREITA em uma árvore AVL?

Dando continuidade ao estudo da Árvore Binária de Busca Balanceada AVL, vamos aprender nesta aula como realizar a operações de rotação à direita para rebalancear nossa árvore.

Precisamos realizar uma rotação à direita quando o fator de balanceamento for positivo. Isso indica que a nossa árvore está desbalanceada para a esquerda. Assim, a raiz da subárvore esquerda será promovida à raiz enquanto a raiz que está desbalanceada se tornará filha. Na figura a seguir temos um exemplo de uma rotação à direita. O nó 35 se torna a nova raiz da árvore enquanto o nó 50 desce e se torna filho à direita do nó 35.

rotação simples a direita
Representação de uma rotação à direita.

Assim como a rotação que vimos na aula anterior, há uma sequência lógica a ser seguida a fim de não perder nenhum nó.

Na figura acima o nó 50 se torna filho à direita do nó 35. Contudo, quem garante que o nó 35 não possui um filho à direita? Antes de manipular os ponteiros precisamos garantir que o filho do nó 35 será salvo caso ele exista. Assim, as primeiras ações são criar um ponteiro auxiliar para o nó 35, que chamamos de y, e outro para o filho à direita do nó 35, que chamamos de f.

Agora podemos realizar a alteração dos ponteiros. O ponteiro esquerda de y aponta para r (raiz) enquanto o ponteiro esquerda de r aponta para o filho salvo na variável f.

Por fim, precisamos recalcular a altura dos nós que foram movimentados na árvore, neste caso os nós r e y, e retornar a nova raiz da árvore, o nó y.

/*
      função para a rotação à direita
*/
No* rotacaoDireita(No *r){
    No *y, *f;

    y = r->esquerdo;
    f = y->direito;

    y->direito = r;
    r->esquerdo = f;

    r->altura = maior(alturaDoNo(r->esquerdo), alturaDoNo(r->direito)) + 1;
    y->altura = maior(alturaDoNo(y->esquerdo), alturaDoNo(y->direito)) + 1;

    return y;
}

Na próxima aula veremos como implementar as rotações duplas.

Deixe um comentário

1 × 3 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.