Você está na página 1de 51

rvores AVL

Estrutura de Dados II Jairo Francisco de Souza

Introduo
As rvores binrias de pesquisa so projetadas para um acesso rpido informao. Idealmente a rvore deve ser razoavelmente equilibrada e a sua altura ser dada (no caso de estar completa) por h=log2(n+1) O tempo de pesquisa tende a O(log2N) Porm, com sucessivas inseres de dados principalmente ordenados, ela pode se degenerar para O(n)

Conceito de balanceamento
rvores completas so aquelas que minimizam o nmero de comparaes efetuadas no pior caso para uma busca com chaves de probabilidades de ocorrncias idnticas. Contudo, para garantir essa propriedade em aplicaes dinmicas, preciso reconstruir a rvore para seu estado ideal a cada operao sobre seus ns (incluso ou excluso).

Conceito de balanceamento
Exemplo:
8 4 2 1 3 5 6 7 9
10 12 14

11

13

Suponha a incluso da chave 0 (zero).

Conceito de balanceamento
Exemplo:
8 4 2 1 0 3 5 6 7 9
10 12 14

11

13

Conceito de balanceamento
Exemplo:
2 1 0 7 3 1 0 2 4 5 6 8
9 11 13

8 4 6 3 5 7 9
10 12 14

11

13

10

12

14

Conceito de balanceamento
Para reorganizar a rvore anterior, foi utilizada uma abordagem O(n), no pior caso. Naturalmente, essa uma pssima soluo, uma vez que operaes como insero e remoo geralmente so efetuados em O(logn) passos. Por esse motivo, rvores completas no so recomendadas para aplicaes que requeiram estruturas dinmicas.

Conceito de balanceamento
Alternativa: utilizar um determinado tipo de rvore binria cujo pior caso para a busca no seja necessariamente to pequeno quanto o mnimo 1 + lower_bound(logn) passos pela rvore completa. Contudo, a altura dessa rvore deve ser da mesma ordem de grandeza que a altura de uma rvore completa com o mesmo nmero de ns.
Ou seja, deve possuir altura O(logn) para todas as suas subrvores.

rvore AVL

A AVL (Adelson-Velskii e Landis 1962) uma rvore altamente balanceada, isto , nas inseres e excluses, procura-se executar uma rotina de balanceamento tal que as alturas das sub-rvores esquerda e sub-rvores direita tenham alturas bem prximas

Definio

Uma rvore AVL uma rvore na qual as alturas das subrvores esquerda e direita de cada n diferem no mximo por uma unidade. Fator de balanceamento Altura da subrvore direita - altura da subrvore esquerda

Exemplo

Nvel 1 Nvel 2 Nvel 3 Nvel 4 Nvel 5

rvore AVL
Em uma rvore AVL, para todo n, seja hd a altura de uma subrvore direita e he a altura de uma subrvore esquerda de um n: hd he {0, 1, -1}

Se o fator de balanceamento de qualquer n ficar menor do que -1 ou maior do que 1 ento a rvore tem que ser balanceada.

Rotaes em AVL
Na insero utiliza-se um processo de balanceamento que pode ser de 2 tipos gerais: Rotao simples Rotao dupla

Rotaes simples

k2 n mais profundo onde falha o equilbrio sub-rvore esquerda est 2 nveis abaixo da direita

Rotaes dupla

Rotao simples no resolve o desequilbrio! sub-rvore Q est a 2 nveis de diferena de R sub-rvore Q passa a estar a 2 nveis de diferena de P

Rotaes dupla

Uma das subrvores B ou C est 2 nveis abaixo de D k2, a chave intermdia, fica na raiz posies de k1, k3 e subrvores completamente determinadas pela ordenao

Rotaes em AVL
Na insero utiliza-se um processo de balanceamento que pode ser de 4 tipos especficos: RR caso Right-Right (rotao a esquerda) LL caso Left-Left (rotao a direita) LR caso Left-Right (rotao esquerda-direita) RL caso Right-Left (rotao direita-esquerda)

Caso Right-Right (rotao a esquerda)

Caso Left-Left (rotao a direita)

Left-Right (rotao esquerda-direita)

Caso Right-Left (rotao direita-esquerda)

Fator de Balanceamento
Coeficiente que serve como referncia para verificar se uma rvore AVL est ou no balanceada O fator calculado n a n e leva em considerao a diferena das alturas das sub-rvores da direita e da esquerda Genericamente FB = he - hd

Exemplo FB de cada n

+2 -1 0 0 +1 0

Quando balancear?

Sempre que existir um fator de balanceamento superior a +1 ou inferior a -1 Caso exista mais de um n que se encaixe neste perfil deve-se sempre balancear o n com o nvel mais alto Como balancear? Utilizando os processos:

Right-Right Left-Left Left-Right Right-Left

Tipos de Balanceamento - RR
Suponha na figura que a ltima clula a ser inserida foi a clula de chave 90 -2 0 -1
+ 2

-1 0

Tipos de Balanceamento - RR
O n X que est no nvel do meio dos trs envolvidos toma o lugar do n com FB=-2 A sub-rvore direita do n X permanece A sub-rvore esquerda do n X ser colocada como sub-rvore direita do n Y O filho esquerdo do n X aponta para o n Y

Tipos de Balanceamento - RR

Tipos de Balanceamento - RR
static Node rotacaoRR(Node y) { Node x = y.right; y.right = x.left; x.left = y; return x; }

Tipos de Balanceamento - LL
Suponha na figura que a ltima clula a ser inserida foi a clula de chave 5 +2 +1 +1 0
+ 2 0

Tipos de Balanceamento - LL
O n X que est no nvel do meio dos trs envolvidos toma o lugar do n com FB=-2 A sub-rvore esquerda do n X permanece A sub-rvore direita do n X ser colocada como sub-rvore esquerda do n Y O filho direito do n X aponta para o n Y

Tipos de Balanceamento - LL

Tipos de Balanceamento - LL
static Node rotacaoLL(Node y) { Node x = y.left; y.left = x.right; x.right = y; return x; }

Tipos de Balanceamento - LR
Suponha na figura que a ltima clula a ser inserida foi a clula de chave 35 +2 -1 0 0
+ 2

0 +1

Tipos de Balanceamento - LR
O n que est no nvel mais alto das trs envolvidas (n X) toma o lugar da clula cujo fator de balanceamento +2 (n Y) A sub-rvore direita do n X ser colocada como sub-rvore esquerda do n Y A sub-rvore esquerda do n X ser colocada como sub-rvore direita do n Z O filho direito do n X aponta para o n Y O filho esquerdo do n X aponta para o n Z

Tipos de Balanceamento - LR

Tipos de Balanceamento - LR
static Node rotacaoLR(Node y) { y.left = rotacaoRR(y.left); return rotacaoLL(y); }

Tipos de Balanceamento - RL
Suponha na figura que a ltima clula a ser inserida foi a clula de chave 75 -2 0
+2

+ 1 -1 0 0

Tipos de Balanceamento - RL
O n que est no nvel mais alto das trs envolvidas (n X) toma o lugar da clula cujo fator de balanceamento -2 (n Y) A sub-rvore direita do n X ser colocada como sub-rvore esquerda do n Z A sub-rvore esquerda do n X ser colocada como sub-rvore direita do n Y O filho direito do n X aponta para o n Y O filho esquerdo do n X aponta para o n Z

Tipos de Balanceamento - RL

Tipos de Balanceamento - RL
static Node rotacaoRL(Node y) { y.right = rotacaoLL(y.right); return rotacaoRR(y); }

rvore AVL
Mais exemplos... Insero de 1, 2 e 3. Ao inserir 3, o n raiz fica desbalanceado (+2)

Rotao esquerda

rvore AVL
Insero do 4 e 5. 4: sem problemas 5: desbalanceamento do n 3 (+2)
Rotao esquerda

rvore AVL
Insero do 6 N 2 fica desbalanceado (+2)

Rotao esquerda

rvore AVL
Insero do n 7 N 5 fica desbalanceado (+2)

Rotao esquerda

rvore AVL
Insero de 15 e 14 Rotao dupla: 14 e 15 direita e depois 7 e 14 esquerda.

rvore AVL
Insero do 13 Rotao do 7 e 14 direita Rotao de 6 e 7 esquerda

rvore AVL
Insero do 12 Rotao da raiz esquerda

rvore AVL
Insero do 11 Rotao de 12 e 13 direita

Algoritmo

Algoritmo recursivo

Inserir n com chave X numa rvore A

recursivamente, inserir na subrvore conveniente de A, SA se a altura de SA no se modifica: terminar se a altura de SA modificada: se ocorre desequilbrio em A, fazer as rotaes necessrias para reequilibrar para evitar o clculo repetido de alturas de sub-rvores, pode-se manter em cada n o resultado da comparao das alturas das sub-rvores

Comparao de alturas

Algoritmo iterativo

Especificar parada logo que uma rotao realizada

Na prtica, so usadas outras rvores binrias equilibradas (como as rvores vermelho-preto) em que a insero ou remoo e a correspondente reposio do equilbrio pode ser feito mais eficientemente

Importante

Na insero, caso a rvore AVL esteja desbalanceada, basta 1 operao de rotao para rebalance-la. Na remoo, caso a rvore esteja desbalanceada, pode ser necessrio at log(n) operaes de rotao.

Como descobrir qual rotao deve ser realizada?

Processo simples (supondo que cada n guarda seu fator de balanceamento):


void AVLTree<tipo>::balanceia(Celula *&x) { if (x->b == 2) { if (x->esq->b == -1) rotateLeft(x->esq); rotateRight(x); } else if (x->b == -2) { if (x->dir->b == 1) rotateRight(x->dir); rotateLeft(x); } }

Exerccios
Construir uma AVL com as chaves: (10, 20, 30, 5, 3, 50, 40, 70, 60, 90) Construir uma AVL com as chaves: (PSC, INF, ENG, QUI, MAT, LET, MED, ECO, ADM)