SCE 182SCC122 – Algoritmos e Estruturas de Dados I – Estruturas de Dados Árvores AVL (Balanceadas) Profª.Drª. Roseli Ap. Francelin Romero Fonte: Profa. Patrícia Marchetti Revisão: Gedson Faria Árvores AVL – (Balanceadas) Definição A altura de uma árvore binária é o nível máximo de suas folhas (profundidade) Uma árvore binária balanceada (AVL) é uma árvore binária na qual as alturas das duas subárvores de todo nó nunca difere em mais de 1. O balanceamento de um NÓ é definido como a altura de sua subárvore esquerda menos a altura de sua subárvore direita. Roseli A. F. Romero Árvores AVL – (Balanceadas) Definição Cada nó numa árvore binária balanceada (AVL) tem balanceamento de 1, -1 ou 0. Se o valor do balanceamento do nó for diferente de 1, -1 e 0. Essa árvore não é balanceada (AVL). Observe o exemplo a seguir: Roseli A. F. Romero Árvores AVL (Balanceada) – Exemplo -1 0 1 0 0 1 0 -1 0 0 0 0 0 0 0 0 0 Roseli A. F. Romero Árvores AVL – (Balanceadas) Se a probabilidade de pesquisar um dado for a mesma para todos os dados, uma árvore binária balanceada determinará a busca mais eficiente. Mas os algoritmos de inserção e remoção já vistos até agora não garantem que essa árvore permanecerá balanceada. Roseli A. F. Romero Árvores AVL (Balanceada) – Exemplo B – inserções que mantêm a árvore balanceada. B B U1 U2 U3 U4 Un – inserções não balanceadas. B BB B U5 U6 U7 U8 U9 U10 U11 U12 Roseli A. F. Romero Árvores Balanceadas - AVL O desbalanceamento ocorre quando: O NÓ é inserido é um descendente esquerdo de um nó que tinha balanceamento de 1 (U1 até U8) OU Se ele for um descendente direito de um nó que tinha balanceamento de –1 (U9 até U12). Roseli A. F. Romero Árvores AVL (Balanceadas) Para manter uma árvore balanceada, é necessário fazer uma transformação na árvore tal que: 1. o percurso em ordem da árvore transformada seja o mesmo da árvore original (isto é, a árvore transformada continue sendo um árvore de busca binária); 2. a árvore transformada fique balanceada. Roseli A. F. Romero Árvores AVL (Balanceadas) A transformação a ser feita na árvore tal que ela se mantenha balanceada é chamada de rotação. A rotação poderá ser feita à esquerda ou à direita dependendo do desbalanceamento que tiver que ser solucionado. A rotação deve ser realizada de maneira que as regras 1 e 2 da transp. Anterior sejam respeitadas. Dependendo do desbalanceamento a ser solucionado, apenas uma rotação não será suficiente para resolvê-lo. Roseli A. F. Romero Árvores AVL – Rotação DIREITA Percurso A em Ordem: C B RHDIBEANJ OFKCLGPMQ D H E F I J R DESBALANCEOU! N SOLUÇÃO: G K O L M P Q ROTAÇÃO DIREITA Roseli A. F. Romero Árvores AVL – Rotação DIREITA Percurso A em Ordem: C RHDIBEANJ D B H R OFKCLGPMQ I ROTAÇÃO DIREITA CONCLUÍDA F E J N G K O L M P Q ÁRVORE ESTÁ NOVAMENTE BALANCEADA!!! Roseli A. F. Romero Árvores AVL – Rotação ESQUERDA A Percurso C em Ordem: B HDIBEAJFRN KOCLGPMQ D H E F I J G K L M DESBALANCEOU! N ROTAÇÃO ESQUERDA O P Q R Roseli A. F. Romero Árvores AVL (Balanceadas) Nos 2 exemplos anteriores de rotação a esquerda e a direita as duas regras foram mantidas: o percurso em ordem da árvore transformada deve ser o mesmo da árvore original (isto é, a árvore transformada continue sendo um árvore de busca binária); a árvore transformada continua balanceada. Roseli A. F. Romero Árvores AVL (Balanceadas) Para o rebalanceamento da árvore é necessário calcular o Fator de Balanceamento para verificar qual rotação deve ser efetuada afim de rebalanceá-la. FB = h da subárvore direita - h da subárvore esquerda Se FB é negativo, as rotações são feitas à direita Se FB é positivo, as rotações são feitas à esquerda Roseli A. F. Romero Árvores AVL (Balanceadas) Há dois tipos de ocorrências nos casos de balanceamento: Caso1: Nó raiz com FB 2 ou –2 com um filho (na direção de onde houve a inserção) com FB 1 ou –1 com o mesmo sinal, neste caso a solução é uma rotação simples. Roseli A. F. Romero Árvores AVL (Balanceadas) FB(raiz)= Hd - He 4 - 2 = 2 FB(10)= Hd – He 3 - 2 = 1 8 4 10 15 9 Solução: rotação à esquerda do nó 8, ou raiz. 12 inserido RoseliNó A. F. Romero Árvores AVL (Balanceadas) Solução: rotação à esquerda do nó 8, ou raiz. 10 8 4 15 9 12 Nó inserido Roseli A. F. Romero Árvores AVL (Balanceadas) Caso 2: Nó raiz com FB 2 ou –2 com um filho (na direção de onde houve a inserção) com FB -1 ou 1 os quais possuem sinais trocados, neste caso a solução é uma rotação dupla. Primeiro rotaciona-se o nó com fator de balanceamento 1 ou –1 na direção apropriada e depois rotaciona-se o nó cujo fator de balanceamento seja 2 ou –2 na direção oposta Roseli A. F. Romero Árvores AVL (Balanceadas) FB(raiz)= 8 4 2 - 10 5 FB(4)= 2 6 2 4 = -2 - 1 = 1 Solução: rotação do nó 4 à esquerda Rotação do nó 8 à direita. Nó inserido Roseli A. F. Romero Árvores AVL (Balanceadas) Solução: rotação do nó 4 à esquerda Rotação do nó 8 à direita. 8 4 10 8 6 2 6 5 10 6 4 Nó inserido 2 8 4 5 2 5 10 Roseli A. F. Romero Árvores AVL (Balanceadas) p Algoritmo de Rotação à direita: void rot_dir(NODEPTR p){ NODEPTR q, temp; q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; } 2 8 q 4 10 6 2 5 temp p 4 8 5 6 10 Roseli A. F. Romero Árvores AVL (Balanceadas) p Algoritmo de Rotação à esquerda: void rot_esq(NODEPTR p){ NODEPTR q, temp; q = p->dir; temp = q->esq; q->esq = p; p->dir = temp; p = q; } 2 8 q 15 2 9 temp 20 17 p 15 20 8 9 17 Roseli A. F. Romero Árvores AVL (Balanceadas) p Algoritmo de Rotação a direita no caso 2: void rot_esq_dir(NODEPTR p){ rot_esq(p->esq); rot_dir(p); } 8 4 10 6 2 5 Roseli A. F. Romero Árvores AVL (Balanceadas) Algoritmo de Rotação à esquerda no caso 2: void rot_dir_esq(NODEPTR p){ rot_dir(p->dir); rot_esq(p); } p 8 15 2 9 20 17 Roseli A. F. Romero