SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
Prof. Adriano Teixeira de Souza
   São estruturas de dados adequadas para a
    representação de hierarquias.

   Uma árvore é composta por um conjunto de
    nós.

   Existe um nó r, denominado raiz, que contém
    zero ou mais subárvores, cujas raízes são
    ligadas diretamente a r.

   A raiz se liga a um ou mais elementos, e cada
    um destes forma uma nova subárvore. Esses
    elementos são seus galhos ou filhos.
   Fundamentos básicos

    ◦ GRAU – número de subárvores de um nó.

    ◦ FOLHA – um nó que possui grau zero, ou seja,
      não possui subárvores.

    ◦ FILHOS – são as raízes das subárvores de um
      nó.

    ◦ Nó não terminal é um nó que não é uma folha
      e é diferente da raiz.
   Fundamentos básicos

    ◦ A altura de uma árvore é o comprimento do
      caminho mais longo da raiz até uma das
      folhas.

    ◦ Uma árvore nula tem altura 0.

    ◦ Todos os nós são acessíveis a partir da raiz.

    ◦ Existe um único caminho entre a raiz e
      qualquer outro nó.
   Formas de representação gráfica
   Árvore Binária: Uma árvore binária é uma
    árvore que pode ser nula, ou então tem as
    seguintes características:

    ◦ Existe um nó especial denominado raiz;

    ◦ Nenhum nó tem grau superior a 2 (dois), isto
      é, nenhum nó tem mais de dois filhos;

    ◦ Existe um “senso de posição”, ou seja,
      distingue-se entre uma subárvore esquerda e
      uma subárvore direita.
   Atravessamento (ou caminhamento) de árvore
    é a passagem de forma sistemática por cada
    um de seus nós;

   Diferentes formas de percorrer os nós de uma
    árvore:

    ◦ Pré-ordem ou prefixa (busca em
      profundidade)
    ◦ Em ordem ou infixa (ordem central)
    ◦ Pós-ordem ou posfixa
    ◦ Em nível
   Pré-ordem (prefixa)
    ◦ visitar a raiz;
    ◦ caminhar na subárvore à esquerda, segundo
      este caminhamento;
    ◦ caminhar na subárvore à direita, segundo este
      caminhamento.
   Atravessamento em ordem (infixa)
    ◦ caminhar na subárvore à esquerda, segundo
      este caminhamento;
    ◦ visitar a raiz;
    ◦ caminhar na subárvore à direita, segundo este
      caminhamento.
   Atravessamento pós-ordem (posfixa)
    ◦ a) caminhar na subárvore à esquerda, segundo
      este caminhamento;
    ◦ b) caminhar na subárvore à direita, segundo
      este caminhamento;
    ◦ c) visitar a raiz.
   Atravessamento em nível
    ◦ Percorre-se a árvore de cima para baixo e da
      direita para a esquerda.
   Árvore Estritamente Binária:
    ◦ É uma árvore binária na qual todo nó tem 0 ou
      2 subárvores, ou seja, nenhum nó tem “filho
      único”.
   Árvore Binária Cheia
    ◦ Todos os nós, exceto os do último nível,
      possuem exatamente duas subárvores.
    ◦ Uma árvore binária cheia de altura h tem 2h –
      1 nós.
   Árvore Degenerada
    ◦ Cada nó possui exatamente um filho, e a
      árvore tem o mesmo número de níveis que de
      nós
   Uma árvore é denominada árvore binária de
    busca se:
    ◦ Todo elemento da subárvore esquerda é
      menor que o elemento raiz;

    ◦ Nenhum elemento da subárvore direita é
      menor que o elemento raiz;

    ◦ As subárvores direita e esquerda também são
      árvores de busca binária.
   Busca

    ◦ Se o valor for igual à raiz, o valor existe na
      árvore.

    ◦ Se o valor for menor do que a raiz, então deve
      buscar-se na subárvore da esquerda, e assim
      recursivamente, em todos os nós da
      subárvore.

    ◦ Se o valor for maior que a raiz, deve-se buscar
      na subárvore da direita, até alcançar-se o nó
      folha da árvore, encontrando ou não o valor
      requerido.
   Inserção

    ◦ Se a árvore estiver vazia, cria um novo no e
      insere as informações do novo nó.

    ◦ Compara a chave a ser inserida com a chave
      do nó analisado:

          Se menor, insere a chave na subárvore esquerda;

          Se maior, insere a chave na subárvore direita.
   Inserção

   Exemplo:
    ◦ Inserir os seguintes elementos: 7, 13, 20, 4, 1,
      18, 5, 11 .
   Remoção

   A remoção de um nó é um processo mais
    complexo. Para excluir um nó de uma árvore
    binária de busca, há de se considerar três
    casos distintos:

    ◦ Remoção na folha

    ◦ Remoção de um nó com um filho

    ◦ Remoção de um nó com dois filhos
   Remoção na folha

    ◦ A exclusão na folha é a mais simples, basta
      removê-lo da árvore.
   Remoção de um nó com um filho

    ◦ Excluindo-o, o filho sobe para a posição do
      pai.
   Remoção de um nó com dois filhos

    ◦ Neste caso, pode-se operar de duas maneiras
      diferentes:

      Substitui-se o valor do nó a ser retirado pelo
       valor sucessor (o nó mais à esquerda da
       subárvore direita);

      Substitui-se o valor do nó a ser retirado pelo
       valor antecessor (o nó mais à direita da
       subárvore esquerda)
   Remoção de um nó com dois filhos

    ◦ Exemplo de remoção substituindo o nó pelo
      seu antecessor.
   Remoção de um nó com dois filhos

    ◦ Exemplo de remoção substituindo o nó pelo
      seu sucessor.
   Árvore é representada pelo ponteiro para o nó raiz

struct noArv {
    int info;
    struct noArv* esq;
    struct noArv* dir;
};
typedef struct noArv NoArv;
   Árvore vazia representada por NULL:


NoArv* abb_cria (void)
{
    return NULL;
}
   Imprime os valores da árvore em ordem crescente,
    percorrendo os nós em ordem simétrica

    void abb_imprime (NoArv* a)
    {
       if (a != NULL) {
          abb_imprime(a->esq);
          printf("%dn",a->info);
          abb_imprime(a->dir);
       }
    }
 Explora a propriedade de ordenação da árvore
 Possui desempenho computacional proporcional à
  altura
 NoArv* abb_busca (NoArv* r, int v)
 {
       if (r == NULL)
           return NULL;
       else if (r->info > v)
           return abb_busca (r->esq, v);
       else if (r->info < v)
           return abb_busca (r->dir, v);
       else return r;
 }
   recebe um valor v a ser inserido
   retorna o eventual novo nó raiz da (sub-)árvore
   para adicionar v na posição correta, faça:
    ◦ se a (sub-)árvore for vazia
      crie uma árvore cuja raiz contém v
    ◦ se a (sub-)árvore não for vazia
      compare v com o valor na raiz
      insira v na sae ou na sad, conforme o resultado da
       comparação
NoArv* abb_insere (NoArv* a, int v)
{
    if (a==NULL) {
       a = (NoArv*)malloc(sizeof(NoArv));
       a->info = v;            é necessário atualizar os ponteiros para
       a->esq = a->dir = NULL; as sub-árvores à esquerda ou à direita
                               quando da chamada recursiva da função,
    }                          pois a função de inserção pode alterar
                               o valor do ponteiro para a raiz da (sub-)árvore.
    else if (v < a->info)
       a->esq = abb_insere(a->esq,v);
    else /* v >= a->info */
       a->dir = abb_insere(a->dir,v);
    return a;
}
Cria
insere   6
insere   8
insere   4
insere   5
insere   2
insere   3
insere   1
insere   9
insere   7
   recebe um valor v a ser inserido
   retorna a eventual nova raiz da árvore
   para remover v, faça:
    ◦ se a árvore for vazia
      nada tem que ser feito
    ◦ se a árvore não for vazia
      compare o valor armazenado no nó raiz com v
      se for maior que v, retire o elemento da sub-árvore à
       esquerda
      se for menor do que v, retire o elemento da sub-
       árvore à direita
      se for igual a v, retire a raiz da árvore
   para retirar a raiz da árvore, há 3 casos:
    ◦ caso 1: a raiz que é folha
    ◦ caso 2: a raiz a ser retirada possui um único filho
    ◦ caso 3: a raiz a ser retirada tem dois filhos
   Caso 1: a raiz da sub-árvore é folha da árvore
    original
    ◦ libere a memória alocada pela raiz
    ◦ retorne a raiz atualizada, que passa a ser NULL
   Caso 2: a raiz a ser retirada possui um único filho
    ◦ libere a memória alocada pela raiz
    ◦ a raiz da árvore passa a ser o único filho da raiz
   Caso 3: a raiz a ser retirada tem dois filhos
    ◦ encontre o nó N que precede a raiz na ordenação
    ◦ (o elemento mais à direita da sub-árvore à esquerda)
    ◦ troque o dado da raiz com o dado de N
    ◦ retire N da sub-árvore à esquerda
    ◦ (que agora contém o dado da raiz que se deseja retirar)
       retirar o nó N mais à direita é trivial, pois N é um nó folha ou
       N é um nó com um único filho (no caso, o filho da direita
        nunca existe)
NoArv* abb_retira (NoArv* r, int v)
{
    if (r == NULL)
       return NULL;
    else if (r->info > v)
       r->esq = abb_retira(r->esq, v);
    else if (r->info < v)
       r->dir = abb_retira(r->dir, v);
    else { /* achou o nó a remover */
         /* nó sem filhos */
       if (r->esq == NULL && r->dir == NULL) {
           free (r);
           r = NULL;
       }
       /* nó só tem filho à direita */
       else if (r->esq == NULL) {
             NoArv* t = r;
             r = r->dir;
             free (t);
       }
/* só tem filho à esquerda */
           else if (r->dir == NULL) {
                NoArv* t = r;
                r = r->esq;
                free (t);
           }
           /* nó tem os dois filhos */
           else {
                NoArv* f = r->esq;
                while (f->dir != NULL) {
                    f = f->dir;
                }
                r->info = f->info; /* troca as informações */
                f->info = v;
                r->esq = abb_retira(r->esq,v);
       }
    }
    return r;
}

Mais conteúdo relacionado

Mais procurados

Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHASAparicio Junior
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasLeinylson Fontinele
 
Estrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoEstrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoLeinylson Fontinele
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADLeinylson Fontinele
 
Árvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programaçãoÁrvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programaçãoEverson Wolf
 
01 introdução à algebra relacional
01   introdução à algebra relacional01   introdução à algebra relacional
01 introdução à algebra relacionalcharlesoliveira13
 
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)Gustavo Zimmermann
 
Árvores Balanceadas AVL
Árvores Balanceadas AVLÁrvores Balanceadas AVL
Árvores Balanceadas AVLDaniel Maia
 

Mais procurados (20)

Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHAS
 
Árvore 2-3
Árvore 2-3Árvore 2-3
Árvore 2-3
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
 
Estrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - ApresentaçãoEstrutura de Dados - Aula 01 - Apresentação
Estrutura de Dados - Aula 01 - Apresentação
 
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TADEstrutura de Dados - Aula 02 - Estrutura de Dados e TAD
Estrutura de Dados - Aula 02 - Estrutura de Dados e TAD
 
Árvores balanceadas - AVL
Árvores balanceadas - AVLÁrvores balanceadas - AVL
Árvores balanceadas - AVL
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Aula sobre Tabela Hash
Aula sobre Tabela HashAula sobre Tabela Hash
Aula sobre Tabela Hash
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
Árvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programaçãoÁrvore B estruturas de dados e técnicas de programação
Árvore B estruturas de dados e técnicas de programação
 
Aula 7 banco de dados
Aula 7   banco de dadosAula 7   banco de dados
Aula 7 banco de dados
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Aula 07 - lista linear
Aula 07 - lista linearAula 07 - lista linear
Aula 07 - lista linear
 
Árvores Rubro Negra
Árvores Rubro NegraÁrvores Rubro Negra
Árvores Rubro Negra
 
Estrutura de Dados - Ponteiros
Estrutura de Dados - PonteirosEstrutura de Dados - Ponteiros
Estrutura de Dados - Ponteiros
 
Aula 08 - árvores
Aula 08 - árvoresAula 08 - árvores
Aula 08 - árvores
 
01 introdução à algebra relacional
01   introdução à algebra relacional01   introdução à algebra relacional
01 introdução à algebra relacional
 
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)
Banco de Dados II: Normalização de dados e as Formas Normais (aula 5)
 
Estrutura de dados - Filas
Estrutura de dados - FilasEstrutura de dados - Filas
Estrutura de dados - Filas
 
Árvores Balanceadas AVL
Árvores Balanceadas AVLÁrvores Balanceadas AVL
Árvores Balanceadas AVL
 

Semelhante a Estrutura de dados - Árvores Binárias

Semelhante a Estrutura de dados - Árvores Binárias (9)

Aula 18
Aula 18Aula 18
Aula 18
 
Aula 19
Aula 19Aula 19
Aula 19
 
Árvores: Conceitos e binárias
Árvores:  Conceitos e bináriasÁrvores:  Conceitos e binárias
Árvores: Conceitos e binárias
 
Operações em Árvores Binárias
Operações em Árvores BináriasOperações em Árvores Binárias
Operações em Árvores Binárias
 
Pged 08
Pged 08Pged 08
Pged 08
 
Inf01203 arvbinarias
Inf01203 arvbinariasInf01203 arvbinarias
Inf01203 arvbinarias
 
Arvores b
Arvores bArvores b
Arvores b
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de busca
 
Aquece Para a prova de EDA3
Aquece Para a prova de EDA3Aquece Para a prova de EDA3
Aquece Para a prova de EDA3
 

Mais de Adriano Teixeira de Souza

Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Adriano Teixeira de Souza
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Adriano Teixeira de Souza
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Adriano Teixeira de Souza
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Adriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSAdriano Teixeira de Souza
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaAdriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Adriano Teixeira de Souza
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Adriano Teixeira de Souza
 
Paradigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de ExceçõesParadigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de ExceçõesAdriano Teixeira de Souza
 

Mais de Adriano Teixeira de Souza (20)

Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
Aplicação de Integração Contínua para viabilizar a rastreabilidade de artefat...
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória Estrutura de dados em Java - Ponteiros e Alocação de Memória
Estrutura de dados em Java - Ponteiros e Alocação de Memória
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
 
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
Estrutura de Dados em Java (Introdução à Programação Orientada a Objetos)
 
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
Estrutura de Dados em Java (Variáveis Compostas - Vetores e Matrizes)
 
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)Estrutura de Dados em Java (Revisão de Algoritimos em Java)
Estrutura de Dados em Java (Revisão de Algoritimos em Java)
 
Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)Estrutura de Dados em Java (Introdução)
Estrutura de Dados em Java (Introdução)
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
 
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
Ferramentas para desenvolvimento web com produtividade - Artigo Final - Pos-G...
 
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)Ferramentas para desenvolvimento web com produtividade -  Slide Artigo (2009)
Ferramentas para desenvolvimento web com produtividade - Slide Artigo (2009)
 
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
Paradigmas de Linguagens de Programação - Biblioteca de Classes e Frameworks
 
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...Paradigmas de Linguagens de Programação - Modularização, componentização e re...
Paradigmas de Linguagens de Programação - Modularização, componentização e re...
 
Paradigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de ExceçõesParadigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de Exceções
 

Estrutura de dados - Árvores Binárias

  • 2. São estruturas de dados adequadas para a representação de hierarquias.  Uma árvore é composta por um conjunto de nós.  Existe um nó r, denominado raiz, que contém zero ou mais subárvores, cujas raízes são ligadas diretamente a r.  A raiz se liga a um ou mais elementos, e cada um destes forma uma nova subárvore. Esses elementos são seus galhos ou filhos.
  • 3. Fundamentos básicos ◦ GRAU – número de subárvores de um nó. ◦ FOLHA – um nó que possui grau zero, ou seja, não possui subárvores. ◦ FILHOS – são as raízes das subárvores de um nó. ◦ Nó não terminal é um nó que não é uma folha e é diferente da raiz.
  • 4. Fundamentos básicos ◦ A altura de uma árvore é o comprimento do caminho mais longo da raiz até uma das folhas. ◦ Uma árvore nula tem altura 0. ◦ Todos os nós são acessíveis a partir da raiz. ◦ Existe um único caminho entre a raiz e qualquer outro nó.
  • 5. Formas de representação gráfica
  • 6. Árvore Binária: Uma árvore binária é uma árvore que pode ser nula, ou então tem as seguintes características: ◦ Existe um nó especial denominado raiz; ◦ Nenhum nó tem grau superior a 2 (dois), isto é, nenhum nó tem mais de dois filhos; ◦ Existe um “senso de posição”, ou seja, distingue-se entre uma subárvore esquerda e uma subárvore direita.
  • 7. Atravessamento (ou caminhamento) de árvore é a passagem de forma sistemática por cada um de seus nós;  Diferentes formas de percorrer os nós de uma árvore: ◦ Pré-ordem ou prefixa (busca em profundidade) ◦ Em ordem ou infixa (ordem central) ◦ Pós-ordem ou posfixa ◦ Em nível
  • 8. Pré-ordem (prefixa) ◦ visitar a raiz; ◦ caminhar na subárvore à esquerda, segundo este caminhamento; ◦ caminhar na subárvore à direita, segundo este caminhamento.
  • 9. Atravessamento em ordem (infixa) ◦ caminhar na subárvore à esquerda, segundo este caminhamento; ◦ visitar a raiz; ◦ caminhar na subárvore à direita, segundo este caminhamento.
  • 10. Atravessamento pós-ordem (posfixa) ◦ a) caminhar na subárvore à esquerda, segundo este caminhamento; ◦ b) caminhar na subárvore à direita, segundo este caminhamento; ◦ c) visitar a raiz.
  • 11. Atravessamento em nível ◦ Percorre-se a árvore de cima para baixo e da direita para a esquerda.
  • 12. Árvore Estritamente Binária: ◦ É uma árvore binária na qual todo nó tem 0 ou 2 subárvores, ou seja, nenhum nó tem “filho único”.
  • 13. Árvore Binária Cheia ◦ Todos os nós, exceto os do último nível, possuem exatamente duas subárvores. ◦ Uma árvore binária cheia de altura h tem 2h – 1 nós.
  • 14. Árvore Degenerada ◦ Cada nó possui exatamente um filho, e a árvore tem o mesmo número de níveis que de nós
  • 15. Uma árvore é denominada árvore binária de busca se: ◦ Todo elemento da subárvore esquerda é menor que o elemento raiz; ◦ Nenhum elemento da subárvore direita é menor que o elemento raiz; ◦ As subárvores direita e esquerda também são árvores de busca binária.
  • 16. Busca ◦ Se o valor for igual à raiz, o valor existe na árvore. ◦ Se o valor for menor do que a raiz, então deve buscar-se na subárvore da esquerda, e assim recursivamente, em todos os nós da subárvore. ◦ Se o valor for maior que a raiz, deve-se buscar na subárvore da direita, até alcançar-se o nó folha da árvore, encontrando ou não o valor requerido.
  • 17. Inserção ◦ Se a árvore estiver vazia, cria um novo no e insere as informações do novo nó. ◦ Compara a chave a ser inserida com a chave do nó analisado:  Se menor, insere a chave na subárvore esquerda;  Se maior, insere a chave na subárvore direita.
  • 18. Inserção  Exemplo: ◦ Inserir os seguintes elementos: 7, 13, 20, 4, 1, 18, 5, 11 .
  • 19. Remoção  A remoção de um nó é um processo mais complexo. Para excluir um nó de uma árvore binária de busca, há de se considerar três casos distintos: ◦ Remoção na folha ◦ Remoção de um nó com um filho ◦ Remoção de um nó com dois filhos
  • 20. Remoção na folha ◦ A exclusão na folha é a mais simples, basta removê-lo da árvore.
  • 21. Remoção de um nó com um filho ◦ Excluindo-o, o filho sobe para a posição do pai.
  • 22. Remoção de um nó com dois filhos ◦ Neste caso, pode-se operar de duas maneiras diferentes:  Substitui-se o valor do nó a ser retirado pelo valor sucessor (o nó mais à esquerda da subárvore direita);  Substitui-se o valor do nó a ser retirado pelo valor antecessor (o nó mais à direita da subárvore esquerda)
  • 23. Remoção de um nó com dois filhos ◦ Exemplo de remoção substituindo o nó pelo seu antecessor.
  • 24. Remoção de um nó com dois filhos ◦ Exemplo de remoção substituindo o nó pelo seu sucessor.
  • 25. Árvore é representada pelo ponteiro para o nó raiz struct noArv { int info; struct noArv* esq; struct noArv* dir; }; typedef struct noArv NoArv;
  • 26. Árvore vazia representada por NULL: NoArv* abb_cria (void) { return NULL; }
  • 27. Imprime os valores da árvore em ordem crescente, percorrendo os nós em ordem simétrica void abb_imprime (NoArv* a) { if (a != NULL) { abb_imprime(a->esq); printf("%dn",a->info); abb_imprime(a->dir); } }
  • 28.  Explora a propriedade de ordenação da árvore  Possui desempenho computacional proporcional à altura NoArv* abb_busca (NoArv* r, int v) { if (r == NULL) return NULL; else if (r->info > v) return abb_busca (r->esq, v); else if (r->info < v) return abb_busca (r->dir, v); else return r; }
  • 29. recebe um valor v a ser inserido  retorna o eventual novo nó raiz da (sub-)árvore  para adicionar v na posição correta, faça: ◦ se a (sub-)árvore for vazia  crie uma árvore cuja raiz contém v ◦ se a (sub-)árvore não for vazia  compare v com o valor na raiz  insira v na sae ou na sad, conforme o resultado da comparação
  • 30. NoArv* abb_insere (NoArv* a, int v) { if (a==NULL) { a = (NoArv*)malloc(sizeof(NoArv)); a->info = v; é necessário atualizar os ponteiros para a->esq = a->dir = NULL; as sub-árvores à esquerda ou à direita quando da chamada recursiva da função, } pois a função de inserção pode alterar o valor do ponteiro para a raiz da (sub-)árvore. else if (v < a->info) a->esq = abb_insere(a->esq,v); else /* v >= a->info */ a->dir = abb_insere(a->dir,v); return a; }
  • 31. Cria insere 6 insere 8 insere 4 insere 5 insere 2 insere 3 insere 1 insere 9 insere 7
  • 32. recebe um valor v a ser inserido  retorna a eventual nova raiz da árvore  para remover v, faça: ◦ se a árvore for vazia  nada tem que ser feito ◦ se a árvore não for vazia  compare o valor armazenado no nó raiz com v  se for maior que v, retire o elemento da sub-árvore à esquerda  se for menor do que v, retire o elemento da sub- árvore à direita  se for igual a v, retire a raiz da árvore
  • 33. para retirar a raiz da árvore, há 3 casos: ◦ caso 1: a raiz que é folha ◦ caso 2: a raiz a ser retirada possui um único filho ◦ caso 3: a raiz a ser retirada tem dois filhos
  • 34. Caso 1: a raiz da sub-árvore é folha da árvore original ◦ libere a memória alocada pela raiz ◦ retorne a raiz atualizada, que passa a ser NULL
  • 35. Caso 2: a raiz a ser retirada possui um único filho ◦ libere a memória alocada pela raiz ◦ a raiz da árvore passa a ser o único filho da raiz
  • 36. Caso 3: a raiz a ser retirada tem dois filhos ◦ encontre o nó N que precede a raiz na ordenação ◦ (o elemento mais à direita da sub-árvore à esquerda) ◦ troque o dado da raiz com o dado de N ◦ retire N da sub-árvore à esquerda ◦ (que agora contém o dado da raiz que se deseja retirar)  retirar o nó N mais à direita é trivial, pois N é um nó folha ou  N é um nó com um único filho (no caso, o filho da direita nunca existe)
  • 37. NoArv* abb_retira (NoArv* r, int v) { if (r == NULL) return NULL; else if (r->info > v) r->esq = abb_retira(r->esq, v); else if (r->info < v) r->dir = abb_retira(r->dir, v); else { /* achou o nó a remover */ /* nó sem filhos */ if (r->esq == NULL && r->dir == NULL) { free (r); r = NULL; } /* nó só tem filho à direita */ else if (r->esq == NULL) { NoArv* t = r; r = r->dir; free (t); }
  • 38. /* só tem filho à esquerda */ else if (r->dir == NULL) { NoArv* t = r; r = r->esq; free (t); } /* nó tem os dois filhos */ else { NoArv* f = r->esq; while (f->dir != NULL) { f = f->dir; } r->info = f->info; /* troca as informações */ f->info = v; r->esq = abb_retira(r->esq,v); } } return r; }