operações em Árvores binárias

39
1 Visite(p) conteúdo do nó apontado por p Esquerda(p) ponteiro para o filho da esquerda de p Direita(p) ponteiro para o filho da direita de p Pai(p) ponteiro para o pai de p Irmão(p) ponteiro para o irmão de p eh_esq(p) Retorna true se p é filho da esquerda e false, se filho da direita eh_dir(p) Retorna true se p é filho da esquerda e false, se filho da direita Operações em Árvores Binárias

Upload: elliando-dias

Post on 03-Jul-2015

26.612 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Operações em Árvores Binárias

1

Visite(p) conteúdo do nó apontado por p

Esquerda(p) ponteiro para o filho da esquerda de p

Direita(p) ponteiro para o filho da direita de p

Pai(p) ponteiro para o pai de p

Irmão(p) ponteiro para o irmão de p

eh_esq(p) Retorna true se p é filho da esquerda e false, se filho da direita

eh_dir(p) Retorna true se p é filho da esquerda e false, se filho da direita

Operações em Árvores Binárias

Page 2: Operações em Árvores Binárias

2

Operações em Árvores Binárias

p = cria(x) Cria uma AB com apenas um nó com conteúdo x. Retorna o ponteiro para a nova árvore.

resp = filho_esq(p,x) Cria um filho à esquerda do nó apontado por p, com conteúdo x.

Retorna false caso já exista um filho esquerdo e true caso contário.

resp = filho_dir (p,x) Cria um filho à direita do nó apontado por p, com conteúdo x.

Retorna false caso já exista um filho direito e true caso contário.

Page 3: Operações em Árvores Binárias

3

Aplicações Com Árvores Binárias É uma estrutura útil quando uma de duas

decisões devem ser tomadas no decorrer do processo. Encontrar todas as duplicatas em uma lista

de números Um forma de fazer isso é comparar o número

como todos os que o precedem isto não é uma solução eficiente

Page 4: Operações em Árvores Binárias

4

Aplicações Com Árvores Binárias Solução: empregar uma árvore binária

Armazenam-se os números na árvore de forma a: o 1º número é armazenado na raiz de uma árvore com

apenas um nó interno cada um dos próximos números na lista é comparado com a

raiz: caso seja igual é uma duplicata caso seja menor, é armazenado na sub-árvore da direita

seguindo-se recursivamente o mesmo procedimento caso seja maior, é armazenado na sub-árvore da esquerda

seguindo-se recursivamente o mesmo procedimento

Page 5: Operações em Árvores Binárias

5

Aplicações Com Árvores Binárias14, 18, 4, 9, 7, 15, 3, 5, 17, 4, 20, 9, 5

3

5

7

9

4

17

15 20

18

14

Page 6: Operações em Árvores Binárias

6

Aplicações com Árvores Binárias outra aplicação comum é atravessar a árvore

binária, visitando cada nó como sistematicamente visitaremos cada nó?

operação é trivial para listas lineares

para árvores, existem diferentes formas de proceder os métodos diferem conforme a ordem em que se

visitam os nós, o problema sendo resolvido

Page 7: Operações em Árvores Binárias

7

Atravessando Árvores Binárias Métodos

pré-ordem:visite a raiz, então visite a subárvore da esquerda, depois a subárvore da direita

em-ordem ou ordem simétrica: visite a subárvore da esquerda, então visite a raiz, depois a subárvore da direita

pós-ordem: visite a subárvore da esquerda, então visite a subárvore da direita, depois a raiz

Page 8: Operações em Árvores Binárias

8

pré-ordem: - * a b * + f g e

em-ordem: a*b - f+g * e

pós-ordem: a b * f g + e * -

Atravessando Árvores Binárias a * b + d - ( f + g ) * e

a b

*

f g

+ e

*

-

Page 9: Operações em Árvores Binárias

9

Atravessando Árvores Binárias

implementação simples dos métodos - recursiva como se visita uma subárvore de cada vez,

seguindo-se a regra recursiva , cada subárvore é visitada começando pela raiz

Page 10: Operações em Árvores Binárias

10

Pré-ordem

pre_ordem (pt){

if (pt == NULL) return ();visite(raiz);pre_ordem (pt->esq);pre_ordem (pt-> dir);

}

Page 11: Operações em Árvores Binárias

11

em-ordem

em_ordem (pt){

if (pt == NULL) return ();em_ordem (pt->esq);visite(raiz);em_ordem (pt-> dir);

}

Page 12: Operações em Árvores Binárias

12

Pós-ordem

pos_ordem (pt){

if (pt == NULL) return ();pos_ordem (pt->esq);pos_ordem (pt-> dir);visite(raiz);

}

Page 13: Operações em Árvores Binárias

13

Árvore Binária Completa representação em lista sequencial

cada nó pode receber um número de 1 a N um nó de número i está na posição i da lista seus filhos da esquerda e da direita nas posições 2i+1

e 2i+2, respectivamente

⇒ não necessita ponteiros⇒ restringe um tamanho para a árvore⇒ também chamada de representação seqüencial

Page 14: Operações em Árvores Binárias

14

H( 8 )

I( 9 )

D( 4 )

E( 5 )

B( 2 )

F( 6 )

G( 7 )

C( 3 )

A( 1 )

A B C D E F G H I

Árvore Binária quase Completa

Page 15: Operações em Árvores Binárias

15

Exercícios implementar os procedimentos pré-

ordem, em-ordem e pós-ordem de forma não recursiva

calcular a altura de cada nó de uma árvore binária (exercício do livro texto)

Page 16: Operações em Árvores Binárias

16

em-ordemp = raiz;do { /* segue pelo ramo da esq. até NULL */ while (p != NULL) {

push(p); p=p->esq;

} /* verifica se já processou toda árvore */ if (pilha_não_vazia()){ p = pop(); visite(p); p = p->dir;

} } while(pilha_não_vazia() || p != NULL);}

H I

D E

B C

A

Page 17: Operações em Árvores Binárias

17

Árvore Binária de Busca

Page 18: Operações em Árvores Binárias

18

Árvore Binária de Busca

construída de tal forma que, para cada nó: nós com chaves menores estão na sub-árvore

esquerda nós com chaves maiores (ou iguais) estão na

sub-árvore direita

a inserção dos nós da árvore deve satisfazer a essa propriedade

Page 19: Operações em Árvores Binárias

19

Árvore Binária de Busca para a busca de uma chave v na árvore binária

de busca: primeiro compare com a raiz

se menor, vá para a sub- árvore esquerda se maior, para a sub-árvore direita

aplique o método recursivamente

Page 20: Operações em Árvores Binárias

20

Árvore Binária de Busca

2

3 5

4

6 9

8

6

Page 21: Operações em Árvores Binárias

21

Árvore Binária de Busca a cada passo, garante-se que nenhuma outra

parte da árvore contém a chave sendo buscada

o procedimento pára quando o nó com v é encontrado senão, chega-se a NULL

Page 22: Operações em Árvores Binárias

22

Árvore Binária de Buscabusca_arvore_nao_recursivo (v, pt){

do { if (v < pt->info)

pt = pt-> esq; else pt = pt-> dir; }while (pt != NULL) && (v != pt->info);

return(pt);}

Page 23: Operações em Árvores Binárias

23

Inserindo em Árvore Binária de Busca

Para inserir um nó na árvore: fazer uma busca com insucesso alocar um novo nó é necessário saber por qual nó se chegou a NULL

será o pai do novo nó

Page 24: Operações em Árvores Binárias

24

Inserindo em Árvore Binária de Busca

2

3 5

4

6 9

8

6

Page 25: Operações em Árvores Binárias

25

Inserindo em Árvore Binária de Busca

2

3 5

4

7

6 9

8

6

Page 26: Operações em Árvores Binárias

26

Inserção Árvore Binária de Buscainsere_árvore (int valor, tipo_nó * pt){ tipo_nó * pai; do{ pai = pt ;

if (valor < pt->chave) pt = pt ->esq ; else pt = pt->esq;

} while(pt != NULL);if (pt == NULL){

pt = aloca();pt ->chave = valor; pt->esq = NULL; pt->dir = NULL;if (v < pai->chave) pai ->esq = pt ;else pai ->dir = pt ;return(pt);

}}

Page 27: Operações em Árvores Binárias

27

Inserção Árvore Binária de Busca a árvore está classificada se percorrida da

forma correta (pre, pos ou em-ordem?) as chaves aparecem em ordem se lidas da

esquerda para a direita podemos ordenar uma sequência como se

fosse uma série de inserções o programa tem apenas os ponteiros para se

preocupar qual a diferença

Page 28: Operações em Árvores Binárias

28

Remoção em Árvore Binária de Busca até então, vimos que a implementação da

operação de inserção é simples a remoção de um elemento já é mais complexa

remoção de um nó folha os ponteiros esquerdo e direito do pai são setados para NULL

se possui apenas um filho o ponteiro apropriado do pai passa a apontar para o filho

se o nó possui dois filhos se um desses dois filhos não possui filhos, use esse nó para

substituir o nó removido

Page 29: Operações em Árvores Binárias

29

Remoção em Árvore Binária de Busca

senão: substituir o valor do nó a ser removido substitua este com o elemento cuja chave é

imediatamente maior (ou menor) é sempre folha?

senão for folha – vá repetindo o procedimento algoritmo?

Page 30: Operações em Árvores Binárias

30

Remoção em Árvore Binária de Busca

2

3 5

4

8

7 10

9

6

Removendo 5: basta que o ponteiro a direita de 4 aponte para

NULL

Page 31: Operações em Árvores Binárias

31

Remoção em Árvore Binária de Busca

Removendo 3: basta que substituir o nó 3 pelo nó 2 continua valendo a regra de formação da árvore

2

3 5

4

8

7 10

9

6

Page 32: Operações em Árvores Binárias

32

Remoção em Árvore Binária de Busca

Removendo 4: basta que o substituir 4 pelo 5 continua valendo a regra de formação da árvore

2

3 5

4

8

7 10

9

6

Page 33: Operações em Árvores Binárias

33

Remoção em Árvore Binária de Busca

Removendo 7 (raiz): substituir o 7 pelo imediatamente maior: 8 – como

determinar? resulta na remoção do elemento de chave 8

2

3 5

4

9

8

12

11

10

7

Page 34: Operações em Árvores Binárias

34

Árvore Binária de Busca A árvore obtida depende da seqüência de

inserção de nós Para que a árvore binária de busca seja

completa completa tem altura mínima o conjunto das chaves deve ser reordenado árvore comum - O (n) árvore completa - O (log n)

Page 35: Operações em Árvores Binárias

35

Árvore Binária de Busca uma árvore binária de busca completa

o conjunto das chaves deve ser re-ordenado sejam so e s n+1 duas chaves fictícias e já inseridas a cada passo inserir em T uma nova chave que seja

de índice médio entre i e j - duas chaves já inseridas

Page 36: Operações em Árvores Binárias

36

Árvore Binária de Busca árvore completa: ótima para a busca

quando a freqüência de acesso aos nós é igual

normalmente estas freqüências são diferentes

é interessante construir uma árvore binária que seja a melhor possível no que diz respeito à busca para freqüências conhecidas

Page 37: Operações em Árvores Binárias

37

Eficiência da Árvore de Busca Depende da ordem original dos dados Se o array original está ordenado (ascendente ou

descendente), as árvores resultantes só tem filhos a direita ou a esquerda a inserção do 1o. nó - 0 comparações a inserção do 2o. nó - 2 comparações a inserção do 3o. nó - 3 comparações

2 + 3 +....+n = n*(n+1)/2 -1 Complexidade - O(n2) - para inserir n nós

Page 38: Operações em Árvores Binárias

38

Eficiência da Árvore de Busca Se a lista original estiver organizada, e se

uma árvore completa (parecida com completa) for se formando:

complexidade da inserção = O( n log n )

Page 39: Operações em Árvores Binárias

39

Eficiência da Árvore de Busca 12, 8, 17, 4, 16 A árvore é balanceada

4

8

2 6

1 7

1 2