CodeGym /Curso Java /Python SELF PT /Balanceamento de Árvores: Árvores AVL

Balanceamento de Árvores: Árvores AVL

Python SELF PT
Nível 55 , Lição 3
Disponível

4.1 Problemas de árvores não balanceadas

Em árvores comuns (não balanceadas), ao adicionar elementos, podem ocorrer alguns efeitos desagradáveis.

1. Aumento da altura da árvore:

Em árvores não balanceadas, a altura pode chegar a n (onde n é o número de nós), o que leva a uma queda de desempenho.

O tempo de execução das operações principais (busca, inserção, remoção) no pior caso se torna O(n).

2. Distribuição desigual de nós:

Em árvores não balanceadas, algumas subárvores podem conter significativamente mais nós do que outras, o que leva a um uso ineficiente de memória e aumento no tempo de processamento.

3. Piora do tempo de execução das operações:

Em árvores não balanceadas, as operações de busca, inserção e remoção requerem mais tempo devido à altura aumentada da árvore.

Exemplo de árvore não balanceada:

Exemplo de árvore não balanceada

Neste exemplo, a árvore acaba se transformando em uma lista ligada, e o tempo de execução das operações se torna linear.

4.2 Definição da árvore AVL e suas propriedades

A árvore AVL (nomeada em homenagem aos seus inventores, Adelson-Velsky e Landis) é um tipo de árvore binária de busca balanceada, onde para qualquer nó, a diferença das alturas de suas subárvores esquerda e direita não excede 1.

Propriedades da árvore AVL:

1. Balanceamento:

A diferença das alturas das subárvores esquerda e direita de qualquer nó não excede 1.

Isso garante uma altura da árvore de O(log n), onde n é o número de nós, garantindo operações eficientes de busca, inserção e remoção.

2. Árvore binária de busca:

A árvore AVL possui todas as propriedades de uma árvore binária de busca: para qualquer nó, todas as chaves na subárvore esquerda são menores que a chave do nó, e todas as chaves na subárvore direita são maiores que a chave do nó.

3. Balanceamento automático:

Após cada operação de inserção ou remoção, o balanceamento da árvore é realizado para manter suas propriedades.

4.3 Exemplos de balanceamento de árvores

Rotações são operações realizadas para restaurar o balanceamento em uma árvore AVL após inserções ou remoções de nós. Existem quatro tipos de rotações: rotação à esquerda, à direita, esquerda-direita e direita-esquerda.

1. Rotação à esquerda (Left Rotation):

Na rotação à esquerda, o nó x sobe, e seu nó filho direito y se torna seu pai. A subárvore esquerda de y se torna a subárvore direita de x.

Rotação à esquerda

2. Rotação à direita (Right Rotation):

Na rotação à direita, o nó x sobe, e seu nó filho esquerdo y se torna seu pai. A subárvore direita de y se torna a subárvore esquerda de x.

Rotação à direita

3. Rotação esquerda-direita (Left-Right Rotation):

Primeiro, uma rotação à esquerda é realizada no nó filho esquerdo, seguido por uma rotação à direita no próprio nó.

Rotação esquerda-direita

4. Rotação direita-esquerda (Right-Left Rotation):

Primeiro, uma rotação à direita é realizada no nó filho direito, seguido por uma rotação à esquerda no próprio nó.

Rotação direita-esquerda

4.4 Operações principais em árvores AVL

As operações principais em árvores AVL incluem inserção, remoção e busca.

Inserção (Insertion)

É preciso inserir um novo nó na árvore AVL e balanceá-lo, se necessário.

Passos:

  1. Inserção de nó:
    • Começamos pela raiz da árvore e recursivamente encontramos o lugar adequado para o novo nó, comparando seu valor com os nós atuais.
    • Inserimos o novo nó na posição encontrada, como em uma árvore binária de busca comum.
  2. Atualização das alturas:
    • Após a inserção, atualizamos as alturas de todos os nós no caminho do novo nó até a raiz.
  3. Balanceamento da árvore:
    • Verificamos o balanceamento de cada nó no caminho do novo nó até a raiz.
    • Se o balanceamento de algum nó estiver quebrado (diferença de altura das subárvores esquerda e direita maior que 1), realizamos a rotação correspondente para restaurar o balanceamento.

Exemplo:

Exemplo de inserção em árvore AVL

2. Remoção (Deletion)

É preciso remover um nó da árvore AVL e balanceá-lo, se necessário.

Passos:

1. Busca e remoção de nó:

  • Começamos pela raiz da árvore e recursivamente encontramos o nó para remoção.
  • Removemos o nó como em uma árvore binária de busca comum:
    • Se o nó for uma folha, simplesmente o removemos.
    • Se o nó tiver um filho, substituímos o nó pelo seu filho.
    • Se o nó tiver dois filhos, encontramos o menor nó na subárvore direita (ou o maior na esquerda), copiamos seu valor para o nó que será removido e recursivamente removemos o menor nó na subárvore direita.

2. Atualização das alturas:

  • Após a remoção, atualizamos as alturas de todos os nós no caminho do nó removido até a raiz.

3. Balanceamento da árvore:

  • Verificamos o balanceamento de cada nó no caminho do nó removido até a raiz.
  • Se o balanceamento de algum nó estiver quebrado, realizamos a rotação correspondente para restaurar o balanceamento.

Exemplo:

Exemplo de remoção em árvore AVL

3. Busca (Search)

Precisamos encontrar um nó com um valor específico na árvore AVL.

Passos:

1. Busca recursiva:

  • Começamos pela raiz da árvore e recursivamente comparamos o valor buscado com os nós atuais.
  • Se o valor for menor que o nó atual, vamos para a subárvore esquerda.
  • Se o valor for maior que o nó atual, vamos para a subárvore direita.
  • Se o valor coincidir com o nó atual, retornamos esse nó.

Exemplo:

Exemplo de busca em árvore AVL
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION