Operações em Árvores Binárias
Upcoming SlideShare
Loading in...5
×
 

Operações em Árvores Binárias

on

  • 24,555 views

 

Statistics

Views

Total Views
24,555
Views on SlideShare
24,399
Embed Views
156

Actions

Likes
3
Downloads
395
Comments
1

1 Embed 156

http://www.slideshare.net 156

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 68

Operações em Árvores Binárias Operações em Árvores Binárias Presentation Transcript

  • Operações em Árvores Binárias
  • Operações em Árvores Binárias
  • 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
  • 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
  • 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
  • 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
  • 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
  • Atravessando Árvores Binárias
    • 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
    • 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
  • Pré-ordem
    • pre_ordem (pt)
    • {
    • if (pt == NULL) return ();
      • visite(raiz);
      • pre_ordem (pt->esq);
      • pre_ordem (pt-> dir);
    • }
  • em-ordem
    • em_ordem (pt)
    • {
    • if (pt == NULL) return ();
      • em_ordem (pt->esq);
      • visite(raiz);
      • em_ordem (pt-> dir);
    • }
  • Pós-ordem
    • pos_ordem (pt)
    • {
    • if (pt == NULL) return ();
      • pos_ordem (pt->esq);
      • pos_ordem (pt-> dir);
      • visite(raiz);
    • }
  • Árvore Binária Completa
    • r epresentaçã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 2 i+1 e 2 i + 2, respectivamente
      • não necessita ponteiros
      • restringe um tamanho para a árvore
      • também chamada de representação seqüencial
  • Árvore Binária quase Completa A B C D E F G H I
  • 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)
  • em -ordem
    • p = 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-> d ir ;
    • }
    • } while( pilha_não_vazia() || p != NULL );
    • }
    H I D E B C A
  • Árvore Binária d e Busca
  • Árvore Binária d e 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
  • Árvore Binária d e 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
  • Árvore Binária d e Busca
  • Árvore Binária d e 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
  • Árvore Binária d e Busca
      • b usca_arvore _nao_recursivo (v , p t)
      • {
      • do {
      • if (v < pt -> info )
      • pt = pt -> e sq;
      • else pt = pt -> dir;
      • }while (pt != NULL) && (v != pt -> info ) ;
      • return( pt ) ;
      • }
  • 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ó
  • Inserindo em Árvore Binária de Busca
  • Inserindo em Árvore Binária de Busca
  • Inserção Árvore Binária de Busca
    • i nsere_árvore (int v alor , tipo_nó * pt )
    • { tipo_nó * pai;
    • do { pai = pt ;
      • if (v alor < pt ->chave) pt = pt ->e sq ;
      • else pt = pt -> esq ;
    • } while( pt != NULL );
    • if (pt == NULL){
        • pt = aloca();
        • pt ->chave = v alor; pt ->e sq = NULL ; pt -> dir = NULL ;
        • if (v < p ai ->chave) p ai ->e sq = pt ;
        • else p ai -> dir = pt ;
        • return( pt );
      • }
    • }
  • 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
  • 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
        • o s ponteiro s 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
  • 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?
  • Remoção em Árvore Binária de Busca
    • Removendo 5:
      • basta que o ponteiro a direita de 4 aponte para NULL
    2 3 5 4 8 7 10 9 6
  • 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
  • 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
  • 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 1 2 11 10 7
  • Á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)
  • Árvore Binária de Busca
    • uma árvore binária de busca completa
      • o conjunto das chaves deve ser re - ordenado
      • s ejam s o 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
  • Árvore Binária de Busca
    • árvore completa : ótima para a busca
      • quando a freqüência de acesso aos nós é igual
    • n ormalmente 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
  • 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 (n 2 ) - para inserir n nós
  • Eficiência da Árvore de Busca
    • Se a lista original estiver organizad a, e se uma árvore completa (parecida com completa) for se formando :
      • complexidade da inserção = O ( n log n )
  • Eficiência da Árvore de Busca
    • 12, 8, 17, 4, 16
    • A árvore é balanceada