ÁRVORE VL Prof. ndré ackes Problema do balanceamento 2 eficiência da busca em uma árvore binária depende do seu balanceamento. O(log N), se a árvore está balanceada O(N), se a árvore não está balanceada N corresponde ao número de nós na árvore 1
Problema do balanceamento 3 Infelizmente, os algoritmos de inserção e remoção em árvores binárias não garantem que a árvore gerada a cada passo esteja balanceada. Dependendo da ordem em que os dados são inseridos na árvore, podemos criar uma árvore na forma de uma escada Problema do balanceamento 4 Inserção dos valores {1,2,3,10,4,5,9,7,8,6} 1 fb = -8 2 fb = -7 3 fb = -6 10 fb = +5 4 fb = -4 5 fb = -3 9 fb = +2 7 6 8 2
Problema do balanceamento 5 Solução para o problema de balanceamento Modificar as operações de inserção e remoção de modo a balancear a árvore a cada nova inserção ou remoção. Garantir que a diferença de alturas das sub-árvores esquerda e direita de cada nó seja de no máximo uma unidade Exemplos de árvores balanceadas Árvore VL Árvore 2-3-4 Árvore Rubro-Negra Árvore VL 6 Definição Tipo de árvore binária balanceada com relação a altura das suas sub-árvores riada por delson-velskii e Landis, de onde recebeu a sua nomenclatura, em 1962 3
Árvore VL 7 Definição Permite o rebalanceamento local da árvore penas a parte afetada pela inserção ou remoção é rebalanceada Usa rotações simples ou duplas na etapa de rebalanceamento Executadas a cada inserção ou remoção s rotações buscam manter a árvore binária como uma árvore quase completa usto máximo de qualquer algoritmo é O(log N) Árvore VL 8 Objetivo das rotações: orrigir o fator de balanceamento (ou fb) Diferença entre as alturas das sub-árvore de um nó aso uma das sub-árvores de um nó não existir, então a altura dessa sub-arvore será igual a -1. Fator de alanceamento F = E - D E ltura da sub-árvore ESQUERD fb = +2 D ltura da sub-árvore DIREIT 4
Árvore VL 9 s alturas das sub-árvores de cada nó diferem de no máximo uma unidade O fator de balanceamento deve ser +1, 0 ou -1 Se fb > +1 ou fb < -1: a árvore deve ser balanceada naquele nó fb = +2 fb = -1 Necessidade de rebalanceamento Árvore VL 10 Voltando ao problema anterior Inserção dos valores {1,2,3,10,4,5,9,7,8,6} 4 fb = -1 2 7 1 3 5 fb = -1 9 6 8 10 5
TD Árvore VL 11 Definindo a árvore riação e destruição: igual a da árvore binária TD Árvore VL 12 alculando o fator de balanceamento 6
Rotações 13 Objetivo: corrigir o fator de balanceamento (ou fb) de cada nó Operação básica para balancear uma árvore VL o todo, existem dois tipos de rotação Rotação simples Rotação dupla Rotações 14 s rotações diferem entre si pelo sentido da inclinação entre o nó pai e filho Rotação simples O nó desbalanceado (pai), seu filho e o seu neto estão todos no mesmo sentido de inclinação Rotação dupla O nó desbalanceado (pai) e seu filho estão inclinados no sentido inverso ao neto Equivale a duas rotações simples. 7
Rotações 15 o todo, existem duas rotações simples e duas duplas: Rotação simples a direita ou Rotação LL Rotação simples a esquerda ou Rotação RR Rotação dupla a direita ou Rotação LR Rotação dupla a esquerda ou Rotação RL Rotações 16 Rotações são aplicadas no ancestral mais próximo do nó inserido cujo fator de balanceamento passa a ser +2 ou -2 pós uma inserção ou remoção, devemos voltar pelo mesmo caminho da árvore e recalcular o fator de balanceamento, fb, de cada nó Se o fb desse nó for +2 ou -2, uma rotação deverá ser aplicada 8
Rotação LL 17 Rotação LL ou rotação simples à direita Um novo nó é inserido na sub-árvore da esquerda do filho esquerdo de é o nó desbalanceado Dois movimentos para a esquerda: LEFT LEFT É necessário fazer uma rotação à direita, de modo que o nó intermediário ocupe o lugar de, e se torne a sub-árvore direita de Rotação LL 18 Exemplo fb = +1 < > fb = +2 > < > Rotação LL em < > > < > 9
TD Árvore VL 19 Rotação LL Rotação LL 20 fb = +1 Árvore VL e fator de balanceamento de cada nó D E 10
Rotação LL 21 F *raiz fb = +2 no fb = +1 D fb = +1 E Inserção do nó F na árvore Árvore fica desbalanceada no nó. plicar Rotação LL no nó no = (*raiz)->esq; (*raiz)->esq = no->dir; no->dir = *raiz; *raiz = no; Rotação LL 22 *raiz D fb = +1 Árvore alanceada F E 11
Rotação RR 23 Rotação RR ou rotação simples à esquerda Um novo nó é inserido na sub-árvore da direita do filho direito de é o nó desbalanceado Dois movimentos para a direita: RIGHT RIGHT É necessário fazer uma rotação à esquerda, de modo que o nó intermediário ocupe o lugar de, e se torne a sub-árvore esquerda de Rotação RR 24 Exemplo < fb = -2 > < fb = -1 < > Rotação RR em < > < < > 12
TD Árvore VL 25 Rotação RR Rotação RR 26 fb = -1 Árvore VL e fator de balanceamento de cada nó D E 13
Rotação RR 27 *raiz D fb = -2 no fb = -1 E fb = -1 F Inserção do nó F na árvore Árvore fica desbalanceada no nó. plicar Rotação RR no nó no = (*raiz)->dir; (*raiz)->dir = no->esq; no->esq = (*raiz); (*raiz) = no; Rotação RR 28 *raiz E fb = -1 Árvore alanceada D F 14
Rotação LR 29 Rotação LR ou rotação dupla à direita Um novo nó é inserido na sub-árvore da direita do filho esquerdo de é o nó desbalanceado Um movimento para a esquerda e outro para a direita: LEFT RIGHT É necessário fazer uma rotação dupla, de modo que o nó se torne o pai dos nós (filho da direita) e (filho da esquerda) Rotação RR em Rotação LL em Rotação LR 30 Exemplo: primeira rotação fb = +2 fb = +2 fb = -1 < < > Rotação RR em fb = +1 > > > < > > > < < < > 15
Rotação LR 31 Exemplo: segunda rotação fb = +1 fb = +2 > Rotação LL em > > < < < > > > > < < < > Rotação LR 32 fb = +1 Árvore VL e fator de balanceamento de cada nó D E 16
Rotação LR 33 fb = +2 Inserção do nó F na árvore fb = -1 Árvore fica desbalanceada no nó. D E fb = +1 plicar Rotação LR no nó. Isso equivale a: F - plicar a Rotação RR no nó - plicar a Rotação LL no nó Rotação LR 34 fb = +2 E fb = +2 Árvore após aplicar a Rotação RR no nó D F 17
Rotação LR 35 E fb = -1 Árvore após aplicar a Rotação LL no nó Árvore alanceada D F Rotação RL 36 Rotação RL ou rotação dupla à esquerda um novo nó é inserido na sub-árvore da esquerda do filho direito de é o nó desbalanceado Um movimento para a direita e outro para a esquerda: RIGHT LEFT É necessário fazer uma rotação dupla, de modo que o nó se torne o pai dos nós (filho da esquerda) e (filho da direita) Rotação LL em Rotação RR em 18
Rotação RL 37 Exemplo fb = -2 fb = -2 < fb = +1 > > Rotação LL em < < < fb = -1 < < > < > < > > Rotação RL 38 Exemplo < fb = -2 < < fb = -1 > < > > Rotação RR em < < < > < > > 19
Rotação RL 39 fb = -1 Árvore VL e fator de balanceamento de cada nó D E Rotação RL 40 fb = -2 Inserção do nó F na árvore fb = +1 Árvore fica desbalanceada no nó. D fb = -1 E plicar Rotação RL no nó. Isso equivale a: F - plicar a Rotação LL no nó - plicar a Rotação RR no nó 20
Rotação RL 41 fb = -2 D fb = -2 Árvore após aplicar a Rotação LL no nó F E Rotação RL 42 fb = +1 D F E Árvore após aplicar a Rotação RR no nó Árvore alanceada 21
Quando usar cada rotação? 43 Uma dúvida muito comum é quando utilizar cada uma das quatro rotações Fator de alanceamento de Fator de alanceamento de +2 +1-2 -1 +2-1 -2 +1 Posições dos nós e em relação ao nó é filho à esquerda de é filho à esquerda de é filho à direita de é filho à direita de é filho à esquerda de é filho à direita de é filho à de direita é filho à esquerda de Rotação LL RR LR RL Quando usar cada rotação? 44 Sinais iguais: rotação simples Sinal positivo: rotação à direita (LL) Sinal negativo: rotação à esquerda (RR) Fator de alanceamento de Fator de alanceamento de +2 +1-2 -1 +2-1 -2 +1 Posições dos nós e em relação ao nó é filho à esquerda de é filho à esquerda de é filho à direita de é filho à direita de é filho à esquerda de é filho à direita de é filho à de direita é filho à esquerda de Rotação LL RR LR RL 22
Quando usar cada rotação? 45 Sinais diferentes: rotação dupla positivo: rotação dupla a direita (LR) negativo: rotação dupla a esquerda (RL) Fator de alanceamento de Fator de alanceamento de +2 +1-2 -1 +2-1 -2 +1 Posições dos nós e em relação ao nó é filho à esquerda de é filho à esquerda de é filho à direita de é filho à direita de é filho à esquerda de é filho à direita de é filho à de direita é filho à esquerda de Rotação LL RR LR RL Árvore VL: Inserção 46 Para inserir um valor V na árvore Se a raiz é igual a NULL, insira o nó Se V é menor do que a raiz: vá para a subárvore esquerda Se V é maior do que a raiz: vá para a sub-árvore direita plique o método recursivamente Dessa forma, percorremos um conjunto de nós da árvore até chegar ao nó folha que irá se tornar o pai do novo nó 23
Árvore VL: Inserção 47 Uma vez inserido o novo nó Devemos voltar pelo caminho percorrido e calcular o fator de balanceamento de cada um dos nós visitados plicar a rotação necessária para restabelecer o balanceamento da árvore se o fator de balanceamento for +2 ou -2 TD Árvore VL 48 Inserção 24
TD Árvore VL 49 Inserção TD Árvore VL 50 Inserção 25
Árvore VL: Inserção 51 Insere valor: 1 1 Insere valor: 2 fb = -1 1 2 Insere valor: 3 1 fb = -2 2 fb = -1 Nó 1 desbalanceado plicar Rotação RR 2 1 3 3 Árvore VL: Inserção 52 Insere valor: 10 fb = -1 2 fb = -1 1 3 10 26
Árvore VL: Inserção 53 Insere valor: 4 Nó 3 desbalanceado plicar Rotação RL 2 fb = -2 fb = -2 2 fb = -1 1 3 1 4 fb = +1 10 3 10 4 Árvore VL: Inserção 54 Insere valor: 5 fb = -2 2 fb = -1 1 4 fb = +1 3 10 Nó 2 desbalanceado plicar Rotação RR 4 fb = +1 2 10 1 3 5 5 27
Árvore VL: Inserção 55 Insere valor: 9 fb = -1 4 fb = +2 2 10 Nó 10 desbalanceado plicar Rotação LR 4 2 9 1 3 5 fb = -1 9 1 3 5 10 Árvore VL: Remoção 56 omo na inserção, temos que percorremos um conjunto de nós da árvore até chegar ao nó que será removido Existem 3 tipos de remoção Nó folha (sem filhos) Nó com 1 filho Nó com 2 filhos 28
Árvore VL: Remoção 57 Uma vez removido o nó Devemos voltar pelo caminho percorrido e calcular o fator de balanceamento de cada um dos nós visitados plicar a rotação necessária para restabelecer o balanceamento da árvore se o fator de balanceamento for +2 ou -2 Remover um nó da sub-árvore direita equivale a inserir um nó na sub-árvore esquerda TD Árvore VL 58 Remoção Trabalha com 2 funções usca pelo nó Remoção do nó com 2 filhos 29
TD Árvore VL 59 Remoção TD Árvore VL 60 Remoção 30
TD Árvore VL 61 Remoção Pai tem 1 ou nenhum filho Pai tem 2 filhos: Substituir pelo nó mais a esquerda da sub-árvore da direita orrige a altura 62 TD Árvore VL Remoção Procura pelo nó mais a esquerda 31
Árvore VL: Remoção 63 Remove valor: 2 fb = +1 4 2 7 1 3 fb = +1 4 fb = +1 3 7 1 Árvore VL: Remoção 64 Remove valor: 7 fb = +1 4 3 7 1 1 fb = +1 3 fb = +2 4 Nó desbalanceado plicar Rotação LL 3 1 4 32
Material omplementar 65 Vídeo ulas ula 79: Árvore VL: Definição ula 80: Árvore VL: Implementação ula 81: Árvore VL: Tipos de Rotação ula 82: Árvore VL: Implementando as Rotações ula 83: Árvore VL: Inserção ula 84: Árvore VL: Remoção 33