E N D
TAD – Árvore AVL ATAI
Árvore AVL As Árvores Binárias de Pesquisa têm uma séria desvantagem que pode afectar o tempo necessário para recuperar um item armazenado. A desvantagem é que a estrutura da árvore depende da ordem em que os elementos são inseridos. Sabemos que se inserirmos os elementos já em ordem, a estrutura da árvore será igual a de uma lista encadeada e o tempo médio para recuperar uma informação da árvore aumenta. A procura é mais rápida na árvore binária de pesquisa equilibrada/balanceada. Árvore AVL é uma árvore binária de pesquisa equilibrada em altura. Para cada nó da árvore as alturas das respectivas subárvores esquerda e direita diferem apenas em um.
Árvore AVL - factor de equilíbrio Para manter o equilíbrio da árvore guardamos em cada nó um “factor de equilíbrio”, designado por balance (bal) do tipo inteiro. bal = altura (right) - altura (left) Como estes duas alturas diferem de pelo menos em 1, o valor de bal deve ser -1, 0 ou +1. As operações são iguais à da árvore binária de pesquisa. Só as operações de insert and deletekey devem ser modificados. Elas devem manter o equilíbrio da árvore.
Árvore AVL - operação insert • Insert determina a localização do novo elemento e adiciona-o. • Durante a operação insert permitimos temporariamente que o valor de bal possa ser -2 e +2. • Quando isto acontece, a árvore deixa de estar equilibrada, sendo necessário uma ou duas rotações para a equilibrar de novo. • Distinguimos entre rotações simples e duplas. As rotações simples diferem entre rotação esquerda e rotação direita.
Árvore AVL - operação insert 1. Adicionar o nó como em árvore binária de pesquisa. O caminho para este nó é o caminho de pesquisa. 2. Subir no caminho de pesquisa actualizando os valores do bal dos nós, até encontrar um nó não balanceado mais perto do novo nó ( tem o valor do bal +2 ou -2). Chamar este nó o eixo. 3. A. Se não existir o eixo, a árvore continua a ser árvore AVL e podemos acabar a operação de inserção actualizando os valores do bal de todos os nós do caminho de pesquisa. B. Se o eixo existe, então para manter a árvore AVL devemos efectuar rotação (direita, esquerda ou dupla) de modo que os valores do bal fiquem correctos e a árvore é uma árvore AVL.
Árvore AVL - Tipos de rotações Que tipo de rotação devemos fazer? • Se o bal do eixo é negativo (sub-árvore esquerda é mais comprida), então se o bal do nó seguinte do caminho de pesquisa é negativo, então rotação para direita, se não (o bal é positivo), então rotação dupla (esquerda-direita) • Se o bal do eixo é positivo (sub-árvore direita é mais comprida), então se o bal do nó seguinte do caminho de pesquisa é positivo, então rotação para esquerda, se não (o bal é negativo), então rotação dupla (direita-esquerda)