Operações em Árvores Binárias

30.780 visualizações

Publicada em

1 comentário
4 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
30.780
No SlideShare
0
A partir de incorporações
0
Número de incorporações
159
Ações
Compartilhamentos
0
Downloads
544
Comentários
1
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • 68
  • Operações em Árvores Binárias

    1. 1. Operações em Árvores Binárias
    2. 2. Operações em Árvores Binárias
    3. 3. Aplicações Com Árvores Binárias <ul><li>É uma estrutura útil quando uma de duas decisões devem ser tomadas no decorrer do processo. </li></ul><ul><ul><li>Encontrar todas as duplicatas em uma lista de números </li></ul></ul><ul><ul><li>Um forma de fazer isso é comparar o número como todos os que o precedem </li></ul></ul><ul><ul><ul><li>isto não é uma solução eficiente </li></ul></ul></ul>
    4. 4. Aplicações Com Árvores Binárias <ul><li>Solução: empregar uma árvore binária </li></ul><ul><ul><li>Armazenam-se os números na árvore de forma a: </li></ul></ul><ul><ul><ul><li>o 1º número é armazenado na raiz de uma árvore com apenas um nó interno </li></ul></ul></ul><ul><ul><ul><li>cada um dos próximos números na lista é comparado com a raiz: </li></ul></ul></ul><ul><ul><ul><ul><li>caso seja igual é uma duplicata </li></ul></ul></ul></ul><ul><ul><ul><ul><li>caso seja menor, é armazenado na sub-árvore da direita seguindo-se recursivamente o mesmo procedimento </li></ul></ul></ul></ul><ul><ul><ul><ul><li>caso seja maior, é armazenado na sub-árvore da esquerda seguindo-se recursivamente o mesmo procedimento </li></ul></ul></ul></ul>
    5. 5. Aplicações Com Árvores Binárias 14, 18, 4, 9, 7, 15, 3, 5, 17, 4, 20, 9, 5 3 5 7 9 4 17 15 20 18 14
    6. 6. Aplicações com Árvores Binárias <ul><li>outra aplicação comum é atravessar a árvore binária, visitando cada nó </li></ul><ul><ul><li>como sistematicamente visitaremos cada nó? </li></ul></ul><ul><li>operação é trivial para listas lineares </li></ul><ul><li>para árvores, existem diferentes formas de proceder </li></ul><ul><ul><li>os métodos diferem conforme a ordem em que se visitam os nós, o problema sendo resolvido </li></ul></ul>
    7. 7. Atravessando Árvores Binárias <ul><li>Métodos </li></ul><ul><ul><li>pré-ordem :visite a raiz, então visite a subárvore da esquerda, depois a subárvore da direita </li></ul></ul><ul><ul><li>em-ordem ou ordem simétrica: visite a subárvore da esquerda, então visite a raiz, depois a subárvore da direita </li></ul></ul><ul><ul><li>pós-ordem : visite a subárvore da esquerda, então visite a subárvore da direita, depois a raiz </li></ul></ul>
    8. 8. Atravessando Árvores Binárias <ul><li>pré-ordem : </li></ul><ul><ul><li>- * a b * + f g e </li></ul></ul><ul><li>em-ordem: </li></ul><ul><ul><li>a*b - f+g * e </li></ul></ul><ul><li>pós-ordem : </li></ul><ul><ul><li>a b * f g + e * - </li></ul></ul>
    9. 9. Atravessando Árvores Binárias <ul><li>implementação simples dos métodos - recursiva </li></ul><ul><ul><li>como se visita uma subárvore de cada vez, seguindo-se a regra recursiva , cada subárvore é visitada começando pela raiz </li></ul></ul>
    10. 10. Pré-ordem <ul><li>pre_ordem (pt) </li></ul><ul><li>{ </li></ul><ul><li> if (pt == NULL) return (); </li></ul><ul><ul><li>visite(raiz); </li></ul></ul><ul><ul><li>pre_ordem (pt->esq); </li></ul></ul><ul><ul><li>pre_ordem (pt-> dir); </li></ul></ul><ul><li>} </li></ul>
    11. 11. em-ordem <ul><li>em_ordem (pt) </li></ul><ul><li>{ </li></ul><ul><li> if (pt == NULL) return (); </li></ul><ul><ul><li>em_ordem (pt->esq); </li></ul></ul><ul><ul><li>visite(raiz); </li></ul></ul><ul><ul><li>em_ordem (pt-> dir); </li></ul></ul><ul><li>} </li></ul>
    12. 12. Pós-ordem <ul><li>pos_ordem (pt) </li></ul><ul><li>{ </li></ul><ul><li> if (pt == NULL) return (); </li></ul><ul><ul><li>pos_ordem (pt->esq); </li></ul></ul><ul><ul><li>pos_ordem (pt-> dir); </li></ul></ul><ul><ul><li>visite(raiz); </li></ul></ul><ul><li>} </li></ul>
    13. 13. Árvore Binária Completa <ul><li>r epresentação em lista sequencial </li></ul><ul><ul><li>cada nó pode receber um número de 1 a N </li></ul></ul><ul><ul><li>um nó de número i está na posição i da lista </li></ul></ul><ul><ul><li>seus filhos da esquerda e da direita nas posições 2 i+1 e 2 i + 2, respectivamente </li></ul></ul><ul><ul><li>não necessita ponteiros </li></ul></ul><ul><ul><li>restringe um tamanho para a árvore </li></ul></ul><ul><ul><li>também chamada de representação seqüencial </li></ul></ul>
    14. 14. Árvore Binária quase Completa A B C D E F G H I
    15. 15. Exercícios <ul><li>implementar os procedimentos pré-ordem, em-ordem e pós-ordem de forma n ão recursiva </li></ul><ul><li>calcular a altura de cada nó de uma árvore binária (exercício do livro texto) </li></ul>
    16. 16. em -ordem <ul><li>p = raiz ; </li></ul><ul><li>do { /* segue pelo ramo da esq. até NULL */ </li></ul><ul><li>while (p != NULL) { </li></ul><ul><li>push(p); </li></ul><ul><li>p=p->esq ; </li></ul><ul><li> } </li></ul><ul><li>/* verifica se já processou toda árvore */ </li></ul><ul><li>if ( pilha_não_vazia() ) { </li></ul><ul><li>p = pop (); </li></ul><ul><li>visite(p) ; </li></ul><ul><li>p = p-> d ir ; </li></ul><ul><li> } </li></ul><ul><li>} while( pilha_não_vazia() || p != NULL ); </li></ul><ul><li>} </li></ul>H I D E B C A
    17. 17. Árvore Binária d e Busca
    18. 18. Árvore Binária d e Busca <ul><li>construída de tal forma que, para cada nó: </li></ul><ul><ul><li>nós com chaves menores estão na sub- á rvore esquerda </li></ul></ul><ul><ul><li>nós com chaves maiores ( ou iguais ) estão na sub- á rvore direita </li></ul></ul><ul><li>a inserção dos nós da árvore deve satisfazer a essa propriedade </li></ul>
    19. 19. Árvore Binária d e Busca <ul><li>para a busca de uma chave v na árvore binária de busca: </li></ul><ul><ul><li>primeiro compare com a raiz </li></ul></ul><ul><ul><ul><li>se menor , vá para a sub- árvore esquerda </li></ul></ul></ul><ul><ul><ul><li>se maior , para a sub-árvore direita </li></ul></ul></ul><ul><li>aplique o método recursivamente </li></ul>
    20. 20. Árvore Binária d e Busca
    21. 21. Árvore Binária d e Busca <ul><li>a cada passo, garante-se que nenhuma outra parte da árvore contém a chave sendo buscada </li></ul><ul><li>o procedimento pára quando </li></ul><ul><ul><li>o nó com v é encontrado </li></ul></ul><ul><ul><li>senão, chega-se a NULL </li></ul></ul>
    22. 22. Árvore Binária d e Busca <ul><ul><li>b usca_arvore _nao_recursivo (v , p t) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>do { </li></ul></ul><ul><ul><li>if (v < pt -> info ) </li></ul></ul><ul><ul><li>pt = pt -> e sq; </li></ul></ul><ul><ul><li>else pt = pt -> dir; </li></ul></ul><ul><ul><li>}while (pt != NULL) && (v != pt -> info ) ; </li></ul></ul><ul><ul><li>return( pt ) ; </li></ul></ul><ul><ul><li>} </li></ul></ul>
    23. 23. Inserindo em Árvore Binária de Busca <ul><li>Para inserir um nó na árvore: </li></ul><ul><ul><li>fazer uma busca com insucesso </li></ul></ul><ul><ul><li>alocar um novo nó </li></ul></ul><ul><ul><li>é necessário saber por qual nó se chegou a NULL </li></ul></ul><ul><ul><ul><li>será o pai do novo nó </li></ul></ul></ul>
    24. 24. Inserindo em Árvore Binária de Busca
    25. 25. Inserindo em Árvore Binária de Busca
    26. 26. Inserção Árvore Binária de Busca <ul><li>i nsere_árvore (int v alor , tipo_nó * pt ) </li></ul><ul><li>{ tipo_nó * pai; </li></ul><ul><li>do { pai = pt ; </li></ul><ul><ul><li>if (v alor < pt ->chave) pt = pt ->e sq ; </li></ul></ul><ul><ul><li>else pt = pt -> esq ; </li></ul></ul><ul><li>} while( pt != NULL ); </li></ul><ul><li>if (pt == NULL){ </li></ul><ul><ul><ul><li>pt = aloca(); </li></ul></ul></ul><ul><ul><ul><li>pt ->chave = v alor; pt ->e sq = NULL ; pt -> dir = NULL ; </li></ul></ul></ul><ul><ul><ul><li>if (v < p ai ->chave) p ai ->e sq = pt ; </li></ul></ul></ul><ul><ul><ul><li>else p ai -> dir = pt ; </li></ul></ul></ul><ul><ul><ul><li>return( pt ); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
    27. 27. Inserção Árvore Binária de Busca <ul><li>a árvore está classificada se percorrida da forma correta (pre, pos ou em-ordem?) </li></ul><ul><ul><li>as chaves aparecem em ordem se lidas da esquerda para a direita </li></ul></ul><ul><li>podemos ordenar uma sequência como se fosse uma série de inserções </li></ul><ul><ul><li>o programa tem apenas os ponteiros para se preocupar </li></ul></ul><ul><ul><li>qual a diferença </li></ul></ul>
    28. 28. Remoção em Árvore Binária de Busca <ul><li>até então, vimos que a implementação da operação de inserção é simples </li></ul><ul><li>a remoção de um elemento já é mais complexa </li></ul><ul><ul><li>remoção de um nó folha </li></ul></ul><ul><ul><ul><li>o s ponteiro s esquerdo e direito do pai são setados para NULL </li></ul></ul></ul><ul><ul><li>se possui apenas um filho </li></ul></ul><ul><ul><ul><li>o ponteiro apropriado do pai passa a apontar para o filho </li></ul></ul></ul><ul><ul><li>se o nó possui dois filhos </li></ul></ul><ul><ul><ul><li>se um desses dois filhos não possui filhos, use esse nó para substituir o nó removido </li></ul></ul></ul>
    29. 29. Remoção em Árvore Binária de Busca <ul><li>senão: substituir o valor do nó a ser removido </li></ul><ul><ul><li>substitua este com o elemento cuja chave é imediatamente maior (ou menor) </li></ul></ul><ul><ul><ul><li>é sempre folha? </li></ul></ul></ul><ul><ul><li>senão for folha – vá repetindo o procedimento </li></ul></ul><ul><ul><li>algoritmo? </li></ul></ul>
    30. 30. Remoção em Árvore Binária de Busca <ul><li>Removendo 5: </li></ul><ul><ul><li>basta que o ponteiro a direita de 4 aponte para NULL </li></ul></ul>2 3 5 4 8 7 10 9 6
    31. 31. Remoção em Árvore Binária de Busca <ul><li>Removendo 3: </li></ul><ul><ul><li>basta que substituir o nó 3 pelo nó 2 </li></ul></ul><ul><ul><li>continua valendo a regra de formação da árvore </li></ul></ul>2 3 5 4 8 7 10 9 6
    32. 32. Remoção em Árvore Binária de Busca <ul><li>Removendo 4: </li></ul><ul><ul><li>basta que o substituir 4 pelo 5 </li></ul></ul><ul><ul><li>continua valendo a regra de formação da árvore </li></ul></ul>2 3 5 4 8 7 10 9 6
    33. 33. Remoção em Árvore Binária de Busca <ul><li>Removendo 7 ( raiz ) : </li></ul><ul><ul><li>substituir o 7 pelo imediatamente maior: 8 – como determinar? </li></ul></ul><ul><ul><li>resulta na remoção do elemento de chave 8 </li></ul></ul>2 3 5 4 9 8 1 2 11 10 7
    34. 34. Árvore Binária de Busca <ul><li>A árvore obtida depende da seqüência de inserção de nós </li></ul><ul><li>Para que a árvore binária de busca seja completa </li></ul><ul><ul><li>completa tem altura mínima </li></ul></ul><ul><ul><li>o conjunto das chaves deve ser reordenado </li></ul></ul><ul><ul><li>árvore comum - O (n) </li></ul></ul><ul><ul><li>árvore completa - O (log n) </li></ul></ul>
    35. 35. Árvore Binária de Busca <ul><li>uma árvore binária de busca completa </li></ul><ul><ul><li>o conjunto das chaves deve ser re - ordenado </li></ul></ul><ul><ul><li>s ejam s o e s n+1 duas chaves fictícias e já inseridas </li></ul></ul><ul><ul><li>a cada passo inserir em T uma nova chave que seja de índice médio entre i e j - duas chaves já inseridas </li></ul></ul>
    36. 36. Árvore Binária de Busca <ul><li>árvore completa : ótima para a busca </li></ul><ul><ul><li>quando a freqüência de acesso aos nós é igual </li></ul></ul><ul><li>n ormalmente estas freqüências são diferentes </li></ul><ul><li>é interessante construir uma árvore binária que seja a melhor possível no que diz respeito à busca para freqüências conhecidas </li></ul>
    37. 37. Eficiência da Árvore de Busca <ul><li>Depende da ordem original dos dados </li></ul><ul><li>Se o array original está ordenado (ascendente ou descendente), as árvores resultantes só tem filhos a direita ou a esquerda </li></ul><ul><ul><li>a inserção do 1o. nó - 0 comparações </li></ul></ul><ul><ul><li>a inserção do 2o. nó - 2 comparações </li></ul></ul><ul><ul><li>a inserção do 3o. nó - 3 comparações </li></ul></ul><ul><li>2 + 3 +....+n = n*(n+1)/2 -1 </li></ul><ul><li>Complexidade - O (n 2 ) - para inserir n nós </li></ul>
    38. 38. Eficiência da Árvore de Busca <ul><li>Se a lista original estiver organizad a, e se uma árvore completa (parecida com completa) for se formando : </li></ul><ul><ul><li>complexidade da inserção = O ( n log n ) </li></ul></ul>
    39. 39. Eficiência da Árvore de Busca <ul><li>12, 8, 17, 4, 16 </li></ul><ul><li>A árvore é balanceada </li></ul>

    ×