44
ÁRVORES Algoritmo e Estrutura de Dados II F a f i m a n - 1

ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Embed Size (px)

Citation preview

Page 1: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

ÁRVORES

Algoritmo e Estrutura de Dados II

Fafi

man

- 1

Page 2: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores

Árvores são estruturas de dados que caracterizam uma relação entre os dados que a compõem;

A relação existente entre os dados (nós) de uma árvore, é uma relação de hierarquia;

Formalmente, uma árvore é um conjunto finito T de um ou mais nós, tais que:

a. Existe um nó denominado raiz da árvore;

b. Os demais nós formam m0 conjuntos separados T1, T2, ..., Tm, onde cada um destes conjuntos é uma árvore. As árvores Ti (1i m) recebem a denominação de subárvores.

Fafi

man

- 2

Page 3: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Esquematicamente, uma árvore pode ser

representada da seguinte forma:

A

CB D

E GF H

KI J

Fafi

man

- 3

Page 4: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Terminologia:

– No exemplo anterior, os quadrados representam os nós da árvore, cuja raiz é o nó ‘A’;

– Pela definição de árvore, cada nó da árvore é raiz de uma subárvore. O número de subárvores de um nó é o grau deste nó;

– O grau de uma árvore é igual ao grau do nó de maior grau pertencente à mesma;

– Um nó de grau zero é chamado de folha ou nó terminal;– O nível do nó é definido como sendo o igual ao número de

nós que o separam da raiz;– A altura de uma árvore é definida como sendo o nível mais

alto da árvore;– Um conjunto de zero ou mais árvores disjuntas é chamado

de floresta;

Fafi

man

- 4

Page 5: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Em relação a árvore descrita anteriormente, pode-se

observar:

Nodo Grau Nível Observações

A 3 0 Raiz da Árvore

B 1 1

C 2 1

D 1 1

E 0 2 Nó folha

F 0 2 Nó folha

G 0 2 Nó folha

H 3 2

I 0 3 Nó folha

J 0 3 Nó folha

K 0 3 Nó folha

Fafi

man

- 5

Page 6: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Quando a ordem das subárvores é significativa, a

árvore é chamada de ordenada. Neste caso, há diferença entre as seguintes árvores:

Entretanto, quando a ordem das subárvores não é relevante, diz-se que a árvore é orientada, uma vez que apenas a orientação dos nós é importante (neste caso as duas árvores mostradas acima são iguais);

Fafi

man

- 6

A

CB

A

BC

Page 7: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores

Fafi

man

- 7

A raiz de uma árvore é chamada de pai das raízes de suas subárvores. As raízes das subárvores de um nó são chamadas de irmãos que, por sua vez, são filhos de seu nó pai.

Formas de Representação de Árvores:– Árvore convencional (grafos)

A

CB

ED F

ouA

C

B

E

D

F

Page 8: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores

– Conjuntos Aninhados ou Diagramas de Venn:

– Parênteses Aninhados:

( A ( B ( D ) ( E ) ) ( C ( F ) ) )

AB C

D E F

Fafi

man

- 8

Page 9: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores

– Barramento ou Tabelas:

A

B

D

E

C

F

– Notação Decimal (DEWEY):

1.A, 1.1.B, 1.1.1.D, 1.1.2.E, 1.2.C, 1.2.1.F.

Fafi

man

- 9

Page 10: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Aplicações de árvores:

– Representações genealógicas;– Representação de objetos que possuem relação

hierárquica.• Exemplo: uma universidade

Fafi

man

- 10

... ...

...

...

Universidade

C. ExatasC. Tec.

D. Eng.D. Inf.

AEDI

C. Bio.

TC

José Maria

Page 11: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores

Aplicações:– Índices de arquivos;– Árvores genealógicas ou hereditárias;– Organização de empresa (organograma);– Avaliação de expressões;– Árvores de decisão;– Busca em tabelas;– Algoritmos e Classificação

Fafi

man

- 11

Page 12: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Exercício: dada a seguinte árvore, encontre:

– A raiz da árvore;– Todos os nós folha;– O grau e o nível de cada nó;– A altura da árvore;– Todas as relações entre nós (irmão, pai, filho);– Descreva a árvore com todas as representações estudadas;

A

B

C F

G

D

E

I

H

L

K

J

M

N

Fafi

man

- 12

Page 13: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias“Conjunto finito de nós que, ou é vazio, ou consiste de uma

raiz ligando duas outras árvores binárias.”

São árvores onde o grau de cada nó é menor ou igual a dois;

As subárvores de cada nó são chamadas subárvore esquerda e subárvore direita;

Assim, se um nó possuir apenas uma subárvore, ela deve ser estabelecida como direita ou esquerda;

Uma árvore binária pode ser vazia, isto é, não possuir nenhum nó;

Fafi

man

- 13

Page 14: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias Alocação:

– Por adjacência:• Nós representados seqüencialmente na

memória;• Esta alocação não é conveniente na maioria

dos casos, pois dificulta a manipulação da estrutura;F

afi

man

- 14

A

C|B|

G| |

DC | E |

F| |

A 2 B 1 D 1 F 0 C 1 E 1 G 0

Page 15: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Type

Registro = char;

Arvore = ^nodo;

nodo = record

item : registro;

esq: arvore;

dir: arvore;

end;

Var

T: Arvore;

Árvores Binárias Alocação:

– Encadeada:• Mais adequada;• Permite melhor manipulação dos

dados com diversas ordens de acesso aos nós;

• Os nós são alocados dinamicamente;

A

C|B|

G| |

DC | E |

F| |

Item de dado

esq dir

| = nil

Fafi

man

- 15

Page 16: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias Caminhamento em Árvores Binárias:

– É a forma de percorrer todos os nós da árvore, com o objetivo de consultar ou alterar suas informações;

– Existem vários métodos de tal forma que cada nó seja “visitado” apenas uma vez;

– Um completo percurso da árvore nos dá um arranjo linear sobre os nós;

– São três os principais caminhos utilizados para percorrer uma árvore binária: visitar os nós em ordem pré-fixada, pós-fixada, ou in-fixa (in-ordem).

Fafi

man

- 16

Page 17: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias Formas de caminhar:

– Pré-ordem: RED• Visitar a raiz;• Percorrer a subárvore esquerda;• Percorrer a subárvore direita;

– In-ordem: ERD (percorre as chaves em ordem crescente)• Percorrer a subárvore esquerda;• Visitar a raiz;• Percorrer a subárvore direita;

– Pós-ordem: EDR (ou forma polonesa)• Percorrer a subárvore esquerda;• Percorrer a subárvore direita;• Visitar a raiz;

Obs.: o termo visita indica alguma manipulação sobre o nó.

Fafi

man

- 17

Page 18: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias Exemplo: dada a seguinte árvore, verifique a

seqüência de nos percorridos segundo as três formas de caminhar sobre árvores binárias.

1

32

11| |10| |

5 |4| | 76|

8| | 9| |

Fafi

man

- 18 Pré-ordem: 1, 2, 4, 5, 8, 3, 6, 9, 7, 10, 11

In-ordem: 4, 2, 8, 5, 1, 6, 9, 3, 10, 7, 11

Pós-ordem: 4, 8, 5, 2, 9, 6, 10, 11, 7, 3, 1 (polonesa)

Page 19: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore Binária Algoritmos de travessia em árvores binárias

– observe que os procedimentos são recursivos, devido à natureza recursiva da estrutura (árvore).

Procedure In_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

In_ordem (T^.Esq);

Writeln (‘Item: ‘, T^.Item);

In_ordem (T^.Dir);

End;

End;

Procedure In_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

In_ordem (T^.Esq);

Writeln (‘Item: ‘, T^.Item);

In_ordem (T^.Dir);

End;

End;

Procedure Pre_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

Writeln (‘Item: ‘, T^.Item);

Pre_ordem (T^.Esq);

Pre_ordem (T^.Dir);

End;

End;

Procedure Pre_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

Writeln (‘Item: ‘, T^.Item);

Pre_ordem (T^.Esq);

Pre_ordem (T^.Dir);

End;

End;

Fafi

man

- 19

Page 20: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias

Procedure Pos_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

Pos_ordem (T^.Esq);

Pos_ordem (T^.Dir);

Writeln (‘Item: ‘, T^.Item);

End;

End;

Procedure Pos_ordem (var T: arvore);

Begin

If (T<>Nil) then

Begin

Pos_ordem (T^.Esq);

Pos_ordem (T^.Dir);

Writeln (‘Item: ‘, T^.Item);

End;

End;

Fafi

man

- 20

Page 21: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Árvore Binária de Busca ou Árvore de Pesquisa:

– Uma ABB para um subconjunto S é uma árvore binária com rótulos no qual cada vértice v está rotulado com elementos e(v) S |:1. Para cada vértice na subárvore Esq de v

e() < e(v);2. Para cada vértice na subárvore Dir de v

e() > e(v);3. Para cada elemento a S, existe exatamente

um vértice v|e(a)=v.

Fafi

man

- 21

Page 22: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Em resumo, uma árvore binária de pesquisa é uma árvore binária onde cada nó interno possue um registro, tal que:– todo registro alocado na sua subárvore

esquerda é menor do que o nó pai;– e todo registro alocado na subárvore

direita é maior do que o nó pai.

Fafi

man

- 22

Page 23: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Exemplo:

Fafi

man

- 23

5

82

11| |9| |

4 |1| | 106|

3| | 7| |

Page 24: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca A estrutura de dados para esta árvore

poderia ser dada por:

Fafi

man

- 24

TypeTchave=integer;Telemento=record

Ch: Tchave;Nome: String[30];{outros campos}

End;Arvore=^Nodo;Nodo=record

Elem: Telemento;Esq, Dir: Arvore;

End;

TypeTchave=integer;Telemento=record

Ch: Tchave;Nome: String[30];{outros campos}

End;Arvore=^Nodo;Nodo=record

Elem: Telemento;Esq, Dir: Arvore;

End;

Page 25: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca Procedimentos para uma árvore binária de

busca:– Inicializa, inserção e remoção;

Para isto, é preciso utilizar os processos recursivos de busca da árvore;– Procurasse um elemento Y na raiz, se ele não for

encontrado deve-se procurá-lo na subárvore esquerda caso ele seja menor que a raiz, ou na subárvore direita se ele for maior que a raiz;

Nos procedimentos de alteração, remoção e consulta a busca deve ter sucesso, nos procedimentos de inserção a busca deve fracassar;

Fafi

man

- 25

Page 26: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca Procedimentos:

Fafi

man

- 26

Procedure Inicializa_arvore (Var T: Arvore); Begin T:=Nil; End;

Procedure Inicializa_arvore (Var T: Arvore); Begin T:=Nil; End;

Procedure Insere_elemento (Var T: Arvore; Var X: Telemento); Begin If (T=Nil) then Begin

New (T);T^.Elem:=X;T^.Esq:=Nil;T^.Dir:=Nil;

End Else If (X.Ch<T^.Elem.Ch) then Insere_elemento (T^.Esq, X)

ElseIf (X.Ch>T^.Elem.Ch) then Insere_elemento (T^.Dir, X) Else T^.Elem:=X {Substituição}

End;

Procedure Insere_elemento (Var T: Arvore; Var X: Telemento); Begin If (T=Nil) then Begin

New (T);T^.Elem:=X;T^.Esq:=Nil;T^.Dir:=Nil;

End Else If (X.Ch<T^.Elem.Ch) then Insere_elemento (T^.Esq, X)

ElseIf (X.Ch>T^.Elem.Ch) then Insere_elemento (T^.Dir, X) Else T^.Elem:=X {Substituição}

End;

Page 27: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Remoção: para se criar este procedimento deve-se fazer uma análise. Pois, se o elemento a ser removido tiver apenas um descendente, a remoção será simples. Mas se o elemento a ser removido tiver dois descendentes, ele deverá ser substituído por aquele que estiver mais a direita em sua subárvore esquerda (maior dos menores); ou por aquele que estiver mais a esquerda em sua subárvore direita (menor dos maiores).

Fafi

man

- 27

Page 28: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca Exemplo: na árvore da transparência 25, se

removêssemos o nó com chave 5, poderíamos substituí-lo pelo nó com chave 4 (como mostra a figura abaixo), ou pelo nó com chave 6.

Fafi

man

- 28

4

82

11| |9| |

3| |1| | 106|

7| |

Page 29: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Fafi

man

- 29

Procedure Remove_elemento (Var T: Arvore; Var X: Telemento); Var A: Arvore; Procedure Maior (Q: Arvore; Var R: Telemento); Begin While Q^.dir <> nil do begin Q:=Q^.dir; end; R:=Q^.Elem; End;...

Procedure Remove_elemento (Var T: Arvore; Var X: Telemento); Var A: Arvore; Procedure Maior (Q: Arvore; Var R: Telemento); Begin While Q^.dir <> nil do begin Q:=Q^.dir; end; R:=Q^.Elem; End;...

...Begin If (T=Nil) then Mensagem (‘Elemento não encontrado na árvore’) Else Begin If (X.Ch<T^.Elem.Ch) then Begin Remove_elemento (T^.Esq, X); End Else Begin If (X.Ch>T^.Elem.Ch) then Begin Remove_elemento (T^.Dir, X); End Else Begin If (T^.Dir=Nil) then Begin

X:=T^.Elem; A:=T; T:=T^.Esq;

Dispose(A); End Else Begin If (T^.Esq=Nil) then Begin

X:=T^.Elem; A:=T; T:=T^.Dir; Dispose(A);

End Else Begin

Maior(T^.Esq,X); T^.Elem := X;

Remove_elemento (T^.Esq,X); End; End; End; End; End; End; {Remove_elemento}

...Begin If (T=Nil) then Mensagem (‘Elemento não encontrado na árvore’) Else Begin If (X.Ch<T^.Elem.Ch) then Begin Remove_elemento (T^.Esq, X); End Else Begin If (X.Ch>T^.Elem.Ch) then Begin Remove_elemento (T^.Dir, X); End Else Begin If (T^.Dir=Nil) then Begin

X:=T^.Elem; A:=T; T:=T^.Esq;

Dispose(A); End Else Begin If (T^.Esq=Nil) then Begin

X:=T^.Elem; A:=T; T:=T^.Dir; Dispose(A);

End Else Begin

Maior(T^.Esq,X); T^.Elem := X;

Remove_elemento (T^.Esq,X); End; End; End; End; End; End; {Remove_elemento}

Neste algoritmo foi utilizado o sucessor a esquerda, ou seja, o maior dos menores.

Page 30: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Ordem de complexidade da árvore binária:

Fafi

man

- 30

500 ||350 ||270 ||250 ||200 ||130 ||110 ||80 ||

100 150 260 400

120 300

220

4 consultas – 15 chaves

3 consultas – 7 chaves

2 consultas – 3 chaves

1 consulta – 1 chave

A Árvore Binária tem complexidade igual a pesquisa binária:-Melhor caso: 1 consulta;-Média: log2

n;

-Pior caso: log2n+1.

Onde n é o número de elementos armazenados na árvore.

Page 31: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Balanceamento:– Busca uma distribuição equilibrada dos

nós;– Busca otimizar a consulta;– Busca minimizar o número médio de

comparações necessário para a localização de uma chave.

Fafi

man

- 31

Page 32: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvores Binárias de Busca

Balanceamento por altura:– Busca-se minimizar a altura da árvore;

Árvore Completamente Balanceada:– Uma árvore é completamente balanceada quando

a distância média dos nós até a raiz for mínima;– Uma árvore binária é dita completamente

balanceada se, para cada nó, o número de nós de suas subárvores diferem de no máximo, 1;

– Árvore completamente balanceada é a árvore com menor altura para o seu número de nós.

Fafi

man

- 32

Page 33: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

Árvores não completamente balanceadas:– Uma árvore balanceada é uma árvore onde a

diferença de altura de qualquer subárvore é no máximo 1;

– O grande esforço exigido para a manutenção de uma árvore completamente balanceada pode não ser compensado pelo ganho de eficiência no processo de busca;

– Árvore não completamente balanceadas beneficiam o processo de busca, exigindo manutenção do balanceamento pouco onerosa.

Fafi

man

- 33

Page 34: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Exemplo de árvore não completamente

balanceada:

140 ||

350 ||270 ||250 ||200 ||130|110 ||80 ||

100 150 260 400 |

120 300

220

Fafi

man

- 34

Neste contexto, destacam-se as árvores AVL, concebidas em 1962, por Adel’son-Vel’skii e Landis, caracterizadas pela seguinte propriedade: para todo nó de uma árvore AVL, a diferença entre as alturas de suas subárvores não excede a uma unidade.

Page 35: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

110 ||

200 ||120 ||80 ||

100 150

130

150 ||

200 ||110 ||80 ||

100 130

120

Árvore AVL Árvore não AVL

Fafi

man

- 35

As constantes inserções e remoções de nós de uma árvore podem provocar o desbalanceamento da mesma. Para corrigir este problema em uma árvore AVL, é necessária a aplicação de uma das quatro rotações que serão vistas a seguir.

Page 36: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

Rotação Direita:

Fafi

man

- 36

p

uc

a b

h

hhh+1

h+2

RotaçãoDireita

u

p

c

a

b hh

h

- u<b<p- u passa a ser a raiz-b é pendurada à esquerda de p- h0

Page 37: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

Exemplo de Rotação Direita:

Fafi

man

- 37

120

110 150

130 200100

80

RotaçãoDireita

120

100 150

130 20080 110

Page 38: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

Rotação Esquerda:

Fafi

man

- 38

p

za

cb

h

h hh+1

h+2

RotaçãoEsquerda

z

p

a

c

bh h

h

- p<b<z- z passa a ser a raiz-b é pendurada à direita de p- h0

Page 39: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL

Exemplo de Rotação Esquerda:

Fafi

man

- 39

RotaçãoEsquerda

120

100 150

130 20080 110

120

130100

11080150

200

Page 40: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Rotação Dupla Direita:

Fafi

man

- 40

RotaçãoDupla Direita

- b<v<c- u<v<p- v passa a ser a raiz-h0

p

v

d

b c

h

hh

u

dh

ou

v

p

da c h

u

b

ou

Page 41: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Exemplo de Rotação Dupla Direita:

Fafi

man

- 41

120

100 150

130 20080 110

RotaçãoDupla Direita

120

110 150

130 20080

100

Page 42: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Rotação Dupla Esquerda:

Fafi

man

- 42

RotaçãoDupla Esquerda

- b<y<c- p<y<z- y passa a ser a raiz-h0

p

y

a

cb

h

h h

z

d h

ou

y

z

da c h

p

b

ou

Page 43: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Exemplo de Rotação Dupla Esquerda:

Fafi

man

- 43

120

100 150

130 20080 110

120

100 130

150

20080 110

RotaçãoDupla Esquerda

Page 44: ÁRVORES Algoritmo e Estrutura de Dados II Fafiman- 1

Árvore AVL Identificação do caso a ser aplicado:

– Supondo que o nó q foi incluído na árvore T, se houver desbalanceamento da árvore, sendo p o nó mais próximo das folhas de T:

• |he(p) – hd(p)| = 2

he: altura da subárvore esquerda

hd: altura da subárvore direita• Caso 1: he(p)>hd(p)

Sendo u o filho à esquerda de p:

1.1. he(u)>hd(u) rotação direita

1.2. hd(u)>he(u) rotação dupla direita

• Caso 2: hd(p)>he(p)Sendo z o filho à direita de p:

2.1. hd(z)>he(z) rotação esquerda

2.2. he(z)>hd(z) rotação dupla esquerda

Fafi

man

- 44