Baixe o app para aproveitar ainda mais
Prévia do material em texto
ÁRVORE AVL ÁRVORE AVL � ÁRVORE BALANCEADA � Uma árvore é dita balanceada quando as suas subárvores à esquerda e à direita possuem a mesma altura. � Todos os links vazios estão no mesmo nível, ou seja, que a árvore está completa.árvore está completa. � A árvore que não está balanceada, define-se como degenerada ÁRVORE AVL � Árvore balanceada 12 9 15 7 11 2013 ÁRVORE AVL � Árvore binária incompleta balanceada 12 9 15 7 11 2013 25 ÁRVORE AVL � Árvore degenerada 12 9 159 15 7 29 2013 25 ÁRVORE AVL � Balanceamento Estático � O balanceamento estático de uma árvore binária consiste em construir uma nova versão, reorganizando-a. � Balanceamento Dinâmico � Árvore AVL em homenagem aos matemáticos russos (Adelson-� Árvore AVL em homenagem aos matemáticos russos (Adelson- Velskii e Landism -1962) ÁRVORE AVL � Uma árvore AVL é uma árvore binária de pesquisa onde a diferença em altura entre as subárvores esquerda e direita é no máximo 1 (positivo ou negativo). � A essa diferença chamamos de “fator de balanceamento” de n (FatBal (n)). � Essa informação deverá constar em cada nó de uma árvore balanceada. ÁRVORE AVL � Assim, para cada nodo podemos definir um fator de balanceamento (FB), que vem a ser um número inteiro igual a: � FB(nodo p) = altura(subárvore direita p) - altura(subárvore esquerda p)altura(subárvore esquerda p) � O Fator de uma folha é sempre Zero (0) ÁRVORE AVL � Exemplos de árvores AVL e árvores não-AVL. � Os números nos nodos representam o FB para cada nodo. � Para uma árvore ser AVL os fatores de balanço devem ser necessariamente -1, 0, ou 1. ÁRVORE AVL � Exemplo de árvore AVL ÁRVORE AVL � Exemplo de árvore não AVL ÁRVORE AVL � Inicialmente inserimos um novo nodo na árvore. � A inserção deste novo nodo pode ou não violar a propriedade de balanceamento. � Caso a inserção do novo nodo não viole a propriedade de balanceamento podemos então continuar inserindo balanceamento podemos então continuar inserindo novos nodos. � Caso contrário precisamos nos preocupar em restaurar o balanço da árvore. A restauração deste balanço é efetuada através do que denominamos ROTAÇÕES na árvore. ÁRVORE AVL � Se quisermos manter a árvore balanceada a cada inserção, devemos ter um algoritmo que ajuste os fatores de balanceamento � O algoritmo corrige a estrutura através de movimentação dos nós, ao que chamamos de “rotação”.dos nós, ao que chamamos de “rotação”. ÁRVORE AVL � Exemplo: � Vamos considerar a seguinte árvore (os números ao lado dos nodos são o FB de cada nodo): ÁRVORE AVL � A árvore acima está balanceada, como podemos observar pelos FB de cada nodo. � Os casos possíveis de desbalanceamento são 2. Veremos cada um deles. ÁRVORE AVL � TIPO 1 - ROTAÇÃO DUPLA � Ao inserir o número 5 na árvore. Esta inserção produziria a seguinte árvore: ÁRVORE AVL � O nodo 8 fica com o FB -2 e tem um filho com FB +1. Neste caso o balanceamento é atingido com duas rotações, também denominada ROTAÇÃO DUPLA. � Primeiro rotaciona-se o nodo com FB 1 para a esquerda. ÁRVORE AVL � A seguir rotaciona-se o nodo que tinha FB -2 na direção oposta (direita neste caso). ÁRVORE AVL A árvore fica: � Os FB nos nodos voltaram a ficar dentro do esperado das árvores AVL. � O caso simétrico ao explicado acima acontece com os sinais de FB trocados, ou seja, um nodo com FB +2 com um filho com FB -1. Também utilizariamos uma rotação dupla, mas nos sentidos contrários, ou seja, o nodo com FB -1 seria rotacionado para a direita e o nodo com FB +2 seria rotacionado para a esquerda. ÁRVORE AVL � Suponha que queremos inserir o nodo 3 na árvore inicial. � A inserção produziria a seguinte árvore: • A inserção do nodo 3 produziu um desbalanço no nodo 8 verificado pelo FB -2 neste nodo. •Neste caso, como os sinais dos FB são os mesmos (nodo 8 com FB -2 e nodo 4com FB -1) significa que precisamos fazer apenas uma ROTAÇÃO SIMPLES à direita no nodo com FB -2. • No caso simétrico (nodo com FB 2) faríamos uma rotação simples à esquerda. ÁRVORE AVL � TIPO 2 –ROTAÇÃO SIMPLES � Após a rotação simples a árvore ficaria: Observe que os FB estão dentro do esperado para mantermos a propriedade de balanceamento de árvores AVL. ÁRVORE AVL � A descrição do algoritmo em pseudo-código para construção de uma árvore AVL: � 1. Insira o novo nodo normalmente (ou seja, da mesma maneira que inserimos numa ABB); � 2. Iniciando com o nodo pai do nodo recém-inserido, teste se � 2. Iniciando com o nodo pai do nodo recém-inserido, teste se a propriedade AVL é violada neste nodo, ou seja, teste se o FB deste nodo é maior do que abs(1). Temos aqui 2 possibilidades: ÁRVORE AVL � 2.1 A condição AVL foi violada � 2.1.1 Execute as operações de rotação conforme for o caso (Tipo 1 ou Tipo 2) � 2.1.2 Volte ao passo 1 2.2 A condição AVL não foi violada.2.2 A condição AVL não foi violada. Se o nodo recém-testado não tem pai, ou seja, é o nodo raiz da árvore, volte para inserir novo nodo (Passo 1) ÁRVORE AVL � DICAS: ÁRVORES AVL � 1. Para identificarmos quando uma rotação é simples ou dupla observamos os sinais de FatBal: •se o sinal for igual, a rotação é simples. •se o sinal for diferente a rotação é dupla.•se o sinal for diferente a rotação é dupla. � 2. Se FB+ rotação para esquerda � 3. Se FB- rotação para direita ÁRVORE AVL � Exercício 1: � Considere a inserção dos seguintes valores (nesta ordem) em uma árvore AVL: 5,3,8,2,4,7,10,1,6,9,11. Para essas inserções nenhuma rotação é necessária. Desenhe a árvore AVL resultante e determine o fator de balanceamento de AVL resultante e determine o fator de balanceamento de cada nó. 5 Inicialmente a árvore esta vazia e inserimos o vértice 5, depois calculamos o fator de balanceamento. FB = altura direita da árvore – altura esquerda da árvore. FB = 0-0 = 0 ÁRVORE AVL Depois inserimos o próximo valor 3, e calculamos o fator de Balanceamento para cada vértice. 5 FB= 0-1 =-1 altura direita: 0 3 FB= 0-0 =0 altura direita: 0 altura esquerda: 1 Não faremos rotações porque os fatores de balanceamento são: 0 e -1. ÁRVORE AVL � Inserimos o valor 8 e calculamos o fator de balanceamento para cada vértice 5 FB= 1-1 = 0 altura direita:1 altura esquerda: 1 3 FB= 0-0 =0 altura direita:1 altura esquerda: 1 8 FB= 0-0 =0 � Não será feita rotação porque a árvore está balanceada ÁRVORE AVL � Inserindo o valor 2, depois calculamos o fator de balanceamento para todos os vértices. 5 FB= 1-2 = -1 altura 3 FB=0 altura esquerda: 1 8 altura direita: 0 2 FB=0-1=-1 altura esquerda: 2 altura direita: 1 FB=0 ÁRVORE AVL � Vamos inserir o valor 4 e calculamos o fator de balanceamento para todos os vértices. 5 FB= 1-2 = -1 altura 3 FB=0 altura esquerda: 1 8 altura direita:12 FB=1-1=0 altura esquerda: 2 altura direita: 1 FB=0 4 ÁRVORE AVL � Vamos inserir o valor 7 e recalculamos o fator de balanceamento para cada vértice. 5 FB= 2-2 = 0 3 FB=0 altura esquerda: 1 8 2 FB=0altura esquerda: 2 altura direita: 2 FB=-1 4 7 FB=0 FB=0 ÁRVORE AVL � Vamos inserir o valor 10 e recalcule o fator de balanceamento para cada vértice 5 FB= 2-2 = 0 3 FB=0 8 2 FB=0altura esquerda: 2 altura direita: 2 FB=0 4 7 FB=0 FB=0 10 FB=0 ÁRVORE AVL � Vamos inserir o valor 1, e recalculamos fator de balanceamento para cada vértice 5 FB= 2-3 = -1 3 FB=-1 8 2 FB=1-2=-1altura esquerda: 3 altura direita: 2 FB=0 4 7 FB=0 FB=0 10 FB=0 1 FB=0 ÁRVORE AVL � Vamos inserir o valor 6 e recalcule o fator de balanceamento para cada vértice 5 FB= 3-3 = 0 3 FB=-1 8 2 FB=1-2=-1 altura esquerda: 3 FB=1-2=-1 4 7 FB=0 FB=-1 10 FB=0 1 FB=0 6 FB=0 altura direita: 3 ÁRVORE AVL � Vamos Inserir o valor 9 e recalcular o fator de balanceamento dos vértices 5 FB= 3-3 = 0 3 FB=-1 8 2 FB=1-2=-1 altura esquerda: 3 FB=2-2=0 4 7 FB=0 FB=-1 10 FB=-1 1 FB=0 6 FB=0 altura direita: 3 9 FB=0 ÁRVORE AVL � Inserindo o ultimo valor 11 e calculando o fator de balanceamento para cada vértice. 5 FB= 3-3 = 0 3 FB=-1 8 2 FB=1-2=-1 altura esquerda: 3 FB=2-2=0 4 7 FB=0 FB=-1 10 FB=0 1 FB=0 6 FB=0 altura direita: 3 9 FB=0 11 FB=0 ÁRVORE AVL � Exercício 2:Construir uma árvore AVL com os seguintes dados: 20, 10, 30, 25, 27. 10 FB= 0-0 = 0 Inserindo o valor 10 ÁRVORE AVL � Inserindo o valor 20, e calculamos o fator de balanceamento para cada vértice 10 FB= 1-0 = 1 20 A árvore esta balanceada porque os fatores de balanceamento são : 0 e 1. FB=0 ÁRVORE AVL � Inserindo o valor 30. Após a inserção calcula-se o fator de balanceamento para cada nó. 10 FB= 2-0 =2 + 2 Sinais iguais rotação simples 20 FB=1-0=1 30 FB=0 Há um desbalanceamento porque o fator de balanceamento sai do seguinte limite: [-1, 0, 1]. FB= 2. Como o desequilíbrio é para a direita então será feito uma rotação simples a direita. + 1 rotação simples ÁRVORE AVL � Após a rotação simples à esquerda recalcula o fator de balanceamento. FB=0-0=0 FB=0-0 =0 20 10 FB=0-0=0 30 FB=0 Os fatores de balanceamento agora são iguais a 0.A árvore esta balanceada. ÁRVORE AVL 20 FB= 2-1 = 1 � Inserir o valo 25, e calculando fator de balanceamento dos vértices temos: 10 30FB=0 FB=0-1=-1 25 FB=0 A árvore permanece balanceada ÁRVORE AVL � Inserindo o valor 27, e calculando o fator de balanceamento para cada vértice. Encontramos um desbalanceamento com FB = -2 e 2. 20 FB= 3-1 = 2 10 30FB=0-0=0 FB=0-2=-2 25 FB=1 Analisando de baixo para cima, encontramos o primeiro fator de desbalanceamento em -2. Como os fatores de desbalanceamento possuem sinais trocados então há uma rotação dupla. Como o desbalanceamento é para à esquerda então a rotação será para a direita.27 FB=0 ÁRVORE AVL � Na rotação dupla à esquerda, primeiro rotaciona-se à direita aonde há fator de balanceamento igual a 1 20 FB= 3-1 = 2 10 30FB=0-0=0 FB=0-2=-2 27 FB=1 Rotação á direita 25 FB=0 27 ÁRVORE AVL � Após a rotação direita então é feita uma rotação à esquerda. No fator de balanceamento igual a 2. 20 FB= 3-1 = 2 10 30FB=0-0=0 FB=0-2=-2 27 FB=1 Rotação á esquerda 25 FB=0 30 ÁRVORE AVL � Após a rotação direita então é feita uma rotação à esquerda. No fator de balanceamento igual a 2. 20 FB= 2-1 = 1 10 27 FB=0 FB=0-0=0 25 FB=0 Rotação dupla á esquerda 30 FB=0
Compartilhar