Você está na página 1de 35

Árvores

Árvores Binárias de Busca


• Em Ciência da Computação, uma árvore binária de busca (ou
árvore binária de pesquisa) é uma estrutura de dados de
árvore binária baseada em nós, onde todos os nós da
subárvore esquerda possuem um valor numérico inferior ao
nó raiz e todos os nós da subárvore direita possuem um valor
superior ao nó raiz. O objetivo desta árvore é estruturar os
dados de forma flexível, permitindo pesquisa binária.
Árvores Binárias de Busca

•Nós - são todos os itens guardados na árvore;


•Raiz - é o nó do topo da árvore (no caso da figura acima, a raiz é o nó 8);
•Filhos - são os nós que vem depois dos outros nós
(no caso da figura acima, o nó 6 é filho do 3);
•Pais - são os nós que vem antes dos outros nós
(no caso da figura acima, o nó 10 é pai do 14);
•Folhas - são os nós que não têm filhos; são os últimos nós da árvore
(no caso da figura acima, as folhas são 1, 4, 7 e 13).
Operação de Busca
• A operação de busca em uma árvore binária por um
determinado valor, pode ser feita de maneira recursiva ou
interativa.
• A busca inicia-se no nó raiz, se o valor contido na raiz não for
o desejado, verificamos se o valor é maior ou menor que o
nó raiz. Caso o valor seja menor que o nó raiz, a busca
continua pelo seu filho menor, ou seja, pelo filho da
esquerda, mas, caso o valor seja maior a busca continua pelo
filho da direita, até que se encontre o valor desejado ou a
busca chegue em um nó folha (valor não encontrado).
Operação de Inserção
• A inserção de um novo valor é praticamente uma busca na
árvore pois, precisamos percorrer toda a árvore até
chegarmos em um nó folha correspondente. Se o valor a ser
inserido for maior que o raiz, seguimos pelo filho da direita,
se for menor seguimos pelo filho da esquerda, até chegarmos
em um nó que mantenha a ordenação da árvore.
Operação de Remoção
Situações possíveis

• Exclusão de um nó folha;
• Exclusão de um nó com 1 filho;
• Exclusão de um nó com 2 filhos;
Operação de Remoção
• Exclusão de um nó folha
Operação de Remoção
• Exclusão de um nó folha (Basta apenas removê-lo da árvore)
Operação de Remoção
• Exclusão de um nó com 1 filho (o filho apenas sobe para a posição
do pai);
Operação de Remoção
• Exclusão de um nó com 2 filhos
- Usando o menor nó da sub-árvore à direita;
- Usando o maior nó da sub-árvore à esquerda;
Removendo o nó 3 usando o procedimento do menor nó da sub-árvore à
direita, pesquisamos pelo menor nó à partir do 6 que no caso será o 4
Operação de Remoção

2 – Removendo o nó 8 usando o procedimento do maior nó da subárvore à esquerda.


Exemplo de Código
Função Inserir em árvore binária:
1.void inserir(tArv *t, int dado){
2. int k;
3. // se t aponta para null, a inserção é na raiz...
4. if (*t == NULL) {
5. *t = (tnoarv *) malloc(sizeof(tnoarv));
6. if (*t == NULL) return;
7. (*t)->esq = NULL;
8. (*t)->dir = NULL;
9. (*t)->info = dado;
10. }
11. // Se o dado a ser inserido for menor que o nó atual, recursividade à esquerda
12. if (dado < (*t)->info) {
13. inserir(&((*t)->esq), dado);
14. }
15. else{
16. // Se o dado a ser inserido for maior que o nó atual, recursividade à direita
17. if (dado > (*t)->info) {
18. inserir(&((*t)->dir), dado);
19. }
20. }
21.}
Árvores AVL
• Nome com origem em seus inventores:
– Georgii Adelson-Velsky e Yevgeniy Landis;
– Publicaram um documento chamado: "Algoritmos para organização
da informação“, em 1962;

• Uma árvore binária de pesquisa T é denominada AVL se:


– Para todos nós de T, as alturas de suas duas sub-árvores
diferem no máximo de uma unidade.

• Para cada inserção ou exclusão no pior caso é de O(log n).


Definições
• Altura de uma árvore (também denominada profundidade) é a
distância entre x e o seu descendente mais afastado. Mais
precisamente, a altura de x é o número de passos do mais longo
caminho que leva de x até uma folha somando um.
– Por definição a altura de uma árvore vazia é -1

E
Altura dessa árvore é 3
/ \
D I Altura de I é 2
/ / \
B G K Altura de K é 1
/ \ / \ /
A C F H J Altura de J é 0
Fator de Balanceamento
• Fator de Balanceamento de um nó:

– dado pelo seu peso em relação a sua sub-árvore


fb = altura árvore direita – altura árvore esquerda

– O fator de balanceamento de uma folha é sempre 0

– Um nó com fator balanceado pode conter 1, 0, ou -1 em seu fator;


– Fatbal = -1, quando a sub-árvore da esquerda é um nível mais alto que a direita.
– Fatbal = 0, quando as duas sub-árvores tem a mesma altura.
– Fatbal = 1, quando a sub-árvore da direita é um nível mais alto que a esquerda.

– Um nó com fator de balanceamento -2 ou 2 é considerada um árvore não-


AVL
• requer um balanceamento por rotação ou dupla-rotação.
Propriedade da AVL
• Procurar manter todas as folhas mais ou
menos na mesma altura de forma a respeitar
o FB < 2

• Ou seja,
Para todo nó
| altura(dir) - altura(esq) | < 2
Exemplos de cálculos de FB

0
Inserção: 4, 2, 3, 6, 5, 1 e 7
+6 Inserção: 1, 2, 3, 4, 5, 6 e 7 0 0
+5

+4 0 0 0 0
+3
+2
+1
0
-1 Inserção: 4, 1, 3, 6, 5, 2 e 7

+2 0

-1 0 0

0
Operação: Inserção

Inserção: 4, 6, 1, 7, 5, 3 e 2.
-1
0

+2 3 0 Op. de balanceamento 0 0

2 -1 0 1 0 0 0 0 0

0 1 0 0

Altura
Fb
Operação: Remoção

0
Inserção: 4, 6, 2 e 7.
+2 Op. de balanceamento 0 0
+1
Remover nó 2 +1
0 +1
2
0 0
0 1

Altura
Fb
Operações
– Adição e exclusão requerem que a árvore esteja
balanceada, se a árvore não estiver balanceada é
necessário seu balanceamento
• através da rotação ou dupla-rotação.
Tipos de Rotações

• Rotação Simples:
– Rotação a Esquerda
– Rotação a Direita

• Rotação Dupla:
– Rotação a Esquerda
– Rotação a Direita
Dicas

a) Para identificar quando uma rotação é simples ou dupla


deve-se observar os sinais dos FBs do nodo
desbalanceado e do filho que gerou o
desbalanceamento:
• Sinal for igual, a rotação é simples
• Sinal for diferente a rotação é dupla

b) Se Fb for positivo (+) a rotação para à esquerda

c) Se Fb for negativa (-) a rotação para à direita


Rotação Simples à Direita
Inserção à esquerda de árvore
desbalanceada à esquerda (bal = -1)

Promover o elemento do meio através


de um giro no sentido horário.
Rotação Simples à Esquerda

Inserção à direita de árvore


desbalanceada à direita (bal = +1)

Promover o elemento do meio através


de um giro no sentido anti-horário.
Exemplo de Rotação Simples

• Suponha que nós queiramos inserir o nó 3 na árvore inicial abaixo

-1 -2 0
8 8 4
0 0 -1 0 Rotação a direita (nó 8) +1 0
4 10 4 10 2 8
0 0 +1 0 0 0 0
2 6 2 6 3 6 10
0
3 3

A inserção do nó 3 produziu um desbalanço no nó 8 verificado pelo FB = -2 neste nó.


Neste caso, como os sinais dos FB são os mesmos (nó 8 com FB = -2 e nó 4 com
FB = -1) significa que precisamos fazer apenas uma ROTAÇÃO SIMPLES.
Rotação Dupla à Esquerda
- Inserção do elemento 20

(rotação simples à direita + rotação simples à esquerda)


Rotação Dupla à Direita
- Inserção do elemento 20

(rotação simples à esquerda + rotação simples à direita)


Exemplo de Rotação Dupla (1/2)

• Suponha que queiramos inserir o nó 5 na árvore abaixo

-1 -2 -2
8 8
0 0 +1 0 (a) -2 0
4 10 4 10
0 0 0 -1 0
2 6 2 6

0 0 0
5

Observe que o nó 8 tem FB = -2 e tem um filho com FB = +1 (sinais opostos).


Neste caso, o balanceamento é alcançado com duas rotações. Primeiro: (a)
rotação simples sobre o nó 4 (com FB = +1) para a esquerda.
Exemplo de Rotação Dupla (2/2)

-2 0
-2 0 (b) 0 +1
0
0 0 0
0 0

Logo após da rotação a esquerda: (b) rotaciona-se o nó 8 (FB = -2) na


direção oposta (direita neste caso).
Caso I: Rotação Simples

• Suponha que inserimos os números 50, 40 e 30 em uma


árvore. Obteremos então:

• A inserção novamente produziu um desbalanceamento.

• Neste caso, como os sinais dos FB são os mesmos, 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.


Caso I: Rotação Simples

• Após a rotação simples teremos:

• A árvore está balanceada dentro das propriedades de AVL.


Exemplo:

• Considerando a árvore abaixo:

• A árvore está balanceada, como podemos observar pelos Fb de cada nodo.


• São dois os possíveis casos de desbalancemento
Caso II: Rotação Dupla

• Ao inserir o número 5 na árvore teremos a seguinte


árvore:

• O nodo 8 fica com o FB -2 e tem um filho com FB +1. Neste caso para manter o
balanceamento devemos aplicar duas rotações, também denominada ROTAÇÃO DUPLA.
• Primeiro rotaciona-se o nodo com FB 1 para a esquerda.
Caso II: Rotação Dupla

• Logo rotaciona-se o nodo que possuía FB -2 na direção


oposta, nesse caso a direita.
Caso II: Rotação Dupla

• Os FB dos 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.

Você também pode gostar