Você está na página 1de 10

Estruturas de Dados

Curso: Ciência da Computação


Disciplina: Estruturas de Dados
Profª Luciana Ap. Oliveira Betetto

Aula 08 - Árvores

1.1. Introdução

As estruturas de dados do tipo árvore são não lineares, ou seja, os elementos que as
compõem não estão armazenados de forma sequencial e também não estão todos encadeados. A
Figura 1 ilustra duas árvores.

Figura 1. Árvores

1.2. Árvore Binária

Uma árvore binária é um conjunto finito de elementos, em que cada elemento é


denominado nó e o primeiro é conhecido como raiz da árvore. Esse conjunto pode estar vazio ou
ser particionado em três subconjuntos: 1º subconjunto (nó raiz), 2º subconjunto (sub-árvore
direita) e 3º subconjunto (sub-árvore esquerda), como mostra a Figura 2.

Figura 2. Árvore Binária

1/10
Estruturas de Dados
As árvores binárias podem ser ilustradas de três formas:

Figura 3. Ilustrações distintas de uma Árvore Binária

Toda árvore binária possui as seguintes propriedades:


a) Todos os nós de uma sub-árvore direita são maiores que o nó raiz.
b) Todos os nós de uma sub-árvore esquerda são menores que o nó raiz.
c) Cada sub-árvore é também uma árvore binária.
d) O grau de um nó representa o seu número de sub-árvores. A Figura 4 mostra os graus dos nós
de uma árvore binária.

Figura 4. Graus dos nós de uma Árvore Binária

e) Na árvore binária, o grau máximo de um nó é 2.


f) O grau de uma árvore é igual ao máximo dos graus de todos os seus nós.
g) Uma árvore binária tem grau máximo igual a 2.
h) Nó pai (Figura 5): nó acima e com ligação direta a outro nó.
i) Nó filho (Figura 5): nó abaixo e com ligação direta a outro nó. São os nós raízes das sub-
árvores.
j) Nós irmãos (Figura 5): são que possuem o mesmo nó pai.
k) Nó folha ou terminal (Figura 5): nó que não possui filhos.

2/10
Estruturas de Dados
Nó raiz
Nó pai dos
nós 2 e 8
Nó filho do nó 6
Nó irmão do nó 8 Nó filho do nó 6
Nó pai dos nós 1 e 4 Nó irmão do nó 2
Nó folha
Nó filho do nó 2
Nó irmão do nó 4 Nó pai do nó 3
Nó folha Nó filho do nó 2
Nó irmão do nó 1

Nó filho do nó 4
Nó folha

Figura 5. Nós raiz, pai, filho, irmãos e folha.

l) Nós ancestrais (Figura 6): são os nós que estão acima de um nó e têm ligação direta ou indireta.

Figura 6. Nós ancestrais.

m) Nós descendentes (Figura 7): são os nós que estão abaixo de um nó e possuem ligação direta
ou indireta.

Figura 7. Nós descendentes.


3/10
Estruturas de Dados
n) Nós descendentes direito (Figura 8): são os nós que estão abaixo de um nó, possuem ligação
direta ou indireta e fazem parte da sub-árvore direita.

Figura 8. Nós descendentes direito.

o) Nós descendentes esquerdo (Figura 9): estão abaixo de um nó, possuem ligação direta ou
indireta e fazem parte da sub-árvore esquerda.

Figura 9. Nós descendentes esquerdo.

p) Nível de um nó (Figura 10): distância do nó raiz.


q) Altura ou profundidade da árvore (Figura 10): nível mais distante da raiz.

Figura 10. Nível e altura.


4/10
Estruturas de Dados
r) Expressão que representa o número máximo de nós em um nível da árvore binária = 2n, onde n
é o nível em questão (Figura 11).

Figura 11. Número máximo de nós em um nível.

s) Árvore estritamente binária (Figura 12): árvore em que todos os nós têm 0 ou 2 filhos.
t) Expressão que representa o número de nós de uma árvore estritamente binária = 2n−1, onde n
é o número de nós folha (Figura 12).

Figura 12. Árvore estritamente binária.

u) Árvore completa (Figura 13): todos os nós com menos de dois filhos ficam no último e no
penúltimo nível.

Figura 13. Árvore completa.

5/10
Estruturas de Dados
v) Árvore cheia (Figura 14): árvore estritamente binária e completa.

Figura 14. Árvore estritamente binária e completa.

Neste tipo de estrutura serão abordadas as seguintes operações: inserir um nó na árvore,


removê-lo, consultar os nós da árvore em ordem, consultar em pré-ordem, consultar em pós-
ordem e esvaziar a árvore.
Na operação de inserção, as propriedades da árvore devem ser obedecidas e todo novo
nó é sempre uma folha.
Na operação de remoção, o filho da direita, que é o mais velho, assume o lugar do nó pai.
Atravessar uma árvore significa percorrer todos os seus nós. Tradicionalmente existem três
atravessamentos possíveis de uma árvore: Infixa ou em ordem; Prefixa ou pré-ordem; Pósfixa ou
pós-ordem.
Na consulta (em ordem, pré-ordem e pós-ordem) (Figura 15), todos os nós são listados,
alterando-se apenas a ordem.
- Consulta em ordem: cada árvore é mostrada com o ramo da esquerda, a raiz e
posteriormente o ramo da direita.
- Consulta pré-ordem: cada árvore é mostrada com a raiz, o ramo da esquerda e
posteriormente o ramo da direita.
- Consulta pós-ordem: cada árvore é mostrada com o ramo da esquerda, o ramo da direita
e posteriormente a raiz.

6/10
Estruturas de Dados

Figura 15. Consultas em uma árvore binária.

1.3. Análise da Complexidade

A relação existente entre a altura da árvore (h) e o número de nós (n) de uma árvore
binária é uma informação muito importante em muitas aplicações. É comum a pergunta pela altura
máxima e mínima de árvores binárias. Possuem altura máxima aquelas em que cada nó possui
apenas um único filho. A altura de tais árvores é igual a n. Já uma árvore completa possui altura
mínima.
A operação de busca em uma árvore binária é igual ao número de nós existentes no
caminho desde a raiz da árvore até o nó procurado. Na árvore binária genérica, no pior caso, esse
nó está a uma distância O(n) da raiz, logo, a complexidade da busca é O(n), que corresponde à
altura da árvore. No melhor caso, em que uma árvore pode possuir altura mínima, que é o caso de
uma árvore binária completa, o tempo de busca é O(log n).
Considerando ainda uma árvore de altura mínima, na operação de inserção, o nó sempre é
inserido em uma folha, e deve percorrer todos os nós desde a raiz, até chegar a uma folha e
acrescentar um filho a ela, gastando nisso a altura da árvore, ou seja, O(log n).
Na operação de remoção, o pior caso é quando o nó a ser removido está em uma folha no
nível mais baixo. Gasta-se a altura da árvore para encontrá-lo, em uma árvore de altura mínima, e
algumas operações de atualização de ponteiros, gerando complexidade O(log n).

7/10
Estruturas de Dados
1.4. Árvores Balanceadas

Um aspecto fundamental do estudo de árvores de busca é, naturalmente, o custo de


acesso a uma chave desejada. Com o intuito de minimizar esse custo, foram desenvolvidas as
árvores binárias de busca e de partilha ótimas. Ambas, porém, se restringem a aplicações
estáticas. Isto é, após um certo número de inserções e remoções, as árvores deixam de ser
ótimas. Além disso, a complexidade da árvore de partilha ótima é muito elevada.

A idéia é manter um custo de acesso na mesma ordem de grandeza ao longo de toda a


utilização da estrutura, inclusive após inclusões e remoções. Para alcançar essa finalidade, a
estrutura deve ser alterada, periodicamente, de forma a se moldar aos novos dados. Uma
estrutura que opera com essas características é denominada balanceada.

1.4.1. O Conceito de Balanceamento

As árvores completas são aquelas que minimizam o número de comparações efetuadas no


pior caso para uma busca com chaves de probabilidades de ocorrência idênticas.
Do ponto de vista das aplicações dinâmicas, o uso de árvores completas é, em geral,
desaconselhável. Após um certo número de inclusões ou exclusões, a árvore pode assumir uma
forma pouco recomendável para o problema de busca. Em um caso extremo, ela pode inclusive
degenerar-se em uma lista.
Para contornar esse problema, uma idéia seria aplicar um algoritmo que tornasse a árvore
novamente completa, tão logo tal característica fosse perdida após uma inclusão ou exclusão. A
dificuldade reside em como efetuar essa operação utilizando um menor número de passos. Por
exemplo, considere uma árvore completa cujo último nível contenha todos os possíveis nós,
exceto aquele que seria o mais a direita de todos. Nessa árvore só há uma possibilidade de
inclusão sem aumento de altura. É a inclusão de uma chave maior do que todas as demais,
conforme indica a Figura 16(a). Se nessa árvore, ao contrário, for incluído um nó de chave menor
do que todas as outras, ela deixaria de ser completa, transformando-se na Figura 16(b). Para
transformar essa última em uma árvore completa, observe que é necessário alterar a posição na
estrutura de todos os seus nós. A Figura 16(c) descreve a árvore completa restabelecida após a
inclusão do nó 0 na Figura 16(a). Observe, em particular, que os nós internos da Figura 16(a)
tornaram-se folhas na Figura 16(c) e vice-versa. Para efetuar essas transformações nas
representações usuais de árvores binárias, é necessário percorrer todos os nós da árvore.
Naturalmente, o custo para o restabelecimento da árvore é excessivo considerando-se que
operações de inserções e remoções fossem efetuadas muitas vezes. Por esse motivo, as árvores
completas (e a busca binária) não são recomendadas para aplicações que requeiram estruturas
dinâmicas.

8/10
Estruturas de Dados

(a)

(b)

(c)

Figura 16. Um exemplo ruim para o restabelecimento de árvores completas.

1.4.2. Árvore AVL

Árvore AVL é uma árvore binária de busca balanceada, ou seja, uma árvore balanceada
(árvore completa) são as árvores que minimizam o número de comparações efetuadas no pior
caso para uma busca com chaves de probabilidades de ocorrências idênticas. Contudo, para
garantir essa propriedade em aplicações dinâmicas, é preciso reconstruir a árvore para seu
estado ideal a cada operação sobre seus nós (inclusão ou exclusão), para ser alcançado um custo
de algoritmo com o tempo de pesquisa tendendo a O(log N).

9/10
Estruturas de Dados
O nome AVL vem de seus criadores soviéticos Adelson Velsky e Landis, e sua primeira
referência encontra-se no documento "Algoritmos para organização da informação" de 1962. A
Figura 17 ilustra uma comparação entre Árvore não AVL e AVL.

Figura 17. Uma comparação entre árvore não AVL e AVL.

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. Cada nó numa árvore binária balanceada (AVL)
tem balanceamento de 1, -1 ou 0. Para garantir essa propriedade, a cada inserção ou remoção o
fator de balanço deve ser atualizado a partir do pai do nó inserido até a raiz da árvore. Na
inserção basta encontrar o primeiro nó desregulado (fb= -2 ou fb= 2), aplicar o operação de
rotação necessária, não havendo necessidade de verificar os demais nós. Na remoção a
verificação deverá prosseguir até a raiz, podendo requerer mais de uma rotação.

Referência:
Ascencio, A.F.G. & Araujo, G.S. Estruturas de Dados. Editora Pearson, 2011.

Szwarcfiter, Jayme Luiz; Markenzon, Lilian. Estruturas de Dados e seus Algoritmos. Editora LTC,
1994.

10/10

Você também pode gostar