GGI06 - Árvore balanceada Marcelo K. Albertini 11 de Setembro de 013
/1 Trabalho 1 implementar programa para resolver o problema entregue programa deve funcionar conforme pedido na descrição 3 fazer apresentação do problema 4 apresentar no dia 11/09/013 5 calcular a complexidade da solução desenvolvida 6 escrever relatório explicando algoritmo, código da implementação do programa, testes realizados e complexidade 7 opcional submeter solução funcional que não exceda tempo limite máximo em br.spoj.com (10 pontos extras)
3/1 Aula de hoje Nesta aula veremos Balanceamento de árvores
4/1 Motivação - balanceamento Balanceamento Garantir que a árvore esteja o mais próxima da completa possível, para ter uma altura média de nós baixa. Porquê balancear árvores? Complexidade das operações de inserção e remoção dependem da altura da árvore. Em uma árvore balanceada, O(log n). Em uma árvore desbalanceada, O(n).
5/1 Exemplo de árvore binária desbalanceada 1 3 4 5
6/1 Exemplo de árvore binária balanceada 1 4 3 5 árvore é balanceada se o máximo de diferença de altura entre nós-folhas é limitado esse limite é tipicamente 1 a altura da árvore balanceada com n nós tem altura igual à parte inteira de log (n) existem algoritmos de construção de árvores balanceadas: AVL e Rubro-Negra
7/1 Estrutura de dados e operações de uma ABB criação de uma árvore inserção de um novo nó exclusão de nó busca por nó caminhos em árvores determinar altura da árvore 1 class Tree { Node raiz ; 3 4 public Tree() {... } // criacao 5 public void insercao (Node n) {... } 6 public boolean exclusao ( int id ) {... } 7 public Node busca( int id ) {... } 8 public int altura () {... } 9... 10 }
8/1 Árvores AVL Árvores de Adelson-Velskii e Landis (196) Para garantir balanceamento, sempre inserimos e removemos nós de maneira balanceada. Altura das subárvores à direita e à diferem no máximo em 1. Queremos inserir o 5 de forma balanceada. Queremos remover o 1 de forma balanceada. 1 3 4
9/1 Balanceamento Método de balanceamento: rotações em árvores rotações podem ser à direita ou à esquerda. Rotação à direita 1 A 1 B C Rotação à esquerda A B C
10/1 Balanceamento Cada nó da AVL tem um fator de balanceamento -1 se subárvore à esquerda é mais alta 0 se subárvore à esquerda tem altura igual à direita 1 se subárvore à direita é mais alta
11/1 Fator de balanceamento 3 5 4 6 1 3 0 5 6 7
1/1 Fator de balanceamento +1 3-1 5 4 0 6 0 0 0 0 1 +1 3 0 0 + 5 6-1 7
13/1 Inserção Após inserção de nó verificar pais do nó continuam balanceados se não continuar balanceado, realizar rotações rotação simples: à direita ou esquerda rotação dupla: à direita-e-esquerda ou esquerda-e-direita
14/1 Inserção Seja árvore, com altura à direita hd e altura à esquerda he, então se um novo nó é inserido à esquerda teremos: Se hd = he, alturas ficarão diferentes Se he < hd, alturas ficarão iguais Se he > hd, altura da esquerda ficará com fator, exigindo balanceamento
15/1 Tipos de desbalanceamento Tipo esquerda-esquerda Tipo esquerda-direita 1 h 1 h h+ h+1 h+1 h+
16/1 Debalanceamento Esquerdo-Esquerdo Tipo esquerda-esquerda 1 C A B Seja q o nó que foi inserido na sub-árvore esquerda de 1 B e C têm a mesma altura A é um nível mais alta Então, fazer rotação à direita: 1 a nova raiz sua sub-árvore da direita B e C sub-árvores de
17/1 Debalanceamento Esquerdo-Esquerdo: resultado Tipo esquerda-esquerda A 1 B C O caso de desbalanceamento direita-direita é simétrico e resolvido com rotação à esquerda. Seja q o nó que foi inserido na sub-árvore esquerda de 1 B e C têm a mesma altura A é um nível mais alta Então, fazer rotação à direita: 1 a nova raiz sua sub-árvore da direita B e C sub-árvores de Resultado: árvore rebalanceada
18/1 Desbalanceamento esquerda-direita Fazer rotação dupla: 3 1 C 1 3 A A B1 C B1 B B Começar com uma rotação à esquerda Terminar com uma rotação à direita
19/1 Inserção: passos inserção igual à árvore-binária após inserção, no máximo um dos casos de desbalaceamento deverá ser tratado : esquerda-esquerda: simples direita-direita: simples esquerda-direita: duplo direita-esquerda: duplo usar altura das subárvores esquerda e direita para calcular fator de desbalanceamento fator = altura(subárvore esquerda) - altura(subárvore direita)
0/1 Algoritmo de balanceamento em um nó qualquer P fator = altura(subárvore esquerda) - altura(subárvore direita) 1 balancear (Node P) { 3 if ( fator (P) < 1) { 4 if ( fator (P. esq) < 0) { 5 // caso esquerda direita 6 rotacao esquerda (P. esq) ; 7 } 8 rotacao direita (P) ; 9 10 else if ( fator (P) > 1) { 11 // simetricamente análogo 1 } 13 }