SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
Curso Superior de Tecnologia em Telemática
                            Programação e Estruturas de Dados

Árvores – Fundamentos e Implementações
                                                 Copyright©2010
                                                 Prof. César Rocha
                                          cesarocha@ifpb.edu.br 1
Objetivos

§ Explorar os conceitos fundamentais acerca do uso
  de árvores utilizando a linguagem C
   § Organização e implementação, características,
     vantagens, desvantagens, regras de utilização,
     operações básicas e algoritmos de implementação
§ Será abordada ainda uma implementação de árvore
  bastante conhecida: árvore binária
§ Este módulo será utilizado como referência na
  entrega dos futuros projetos
   § Implementação das estruturas e algoritmos, criação
     das bibliotecas e práticas de laboratório
                                                          2
Estrutura de Dados I




  Parte 1 :
Fundamentos

                           3
Motivação

§ Ao longo de todo o curso, temos examinado
  estruturas de dados que podem ser chamadas de
  unidimensionais ou lineares
   § Por exemplo: TADs que usam vetores e todas as listas.
§ A importância destes tipos de estruturas é
  incontestável, porém...
   § elas não são adequadas para representarmos dados
     que devem ser dispostos de maneira hierárquica
   § não faz sentido, por exemplo, representar uma árvore
     de diretórios de um sistema operacional utilizando um
     vetor linear e pré-dimensionado
                                                             4
Conceitos

§ Uma árvore consiste de uma estrutura não-linear
  que representa uma relação de hierarquia
§ Uma árvore é composta por um conjunto de nós
  § Existe um nó R, chamado de nó raiz
     § Este nó contém zero ou mais sub-árvores, cujas raízes
       são ligadas diretamente à R
  § Os nós raízes das sub-árvores são ditos filhos do nó R
  § Nós que não têm filhos são chamados de folhas
§ É bastante comum desenhar as árvores com o nó
  raiz para cima e os nós folhas para baixo
                                                               5
Graficamente

      TArvore *a              Raiz
                                           Nó RAIZ
                                           Nó RAIZ




Filho do nó A
Filho do nó A                                        Sub-árvores do nó RAIZ
                                                     Sub-árvores do nó RAIZ
                      A                B



                C           D                  F               Nós folhas
                                                               Nós folhas

      § Representamos explicitamente a direção dos
        ponteiros, na figura acima:
           § Eles apontam sempre do pai para os filhos
      § Diferente do exemplo acima, podemos ter nós
        contendo mais de duas sub-árvores                                     6
Grau

§ O número de sub-árvores presentes em um
  determinado nó indicará o Grau desse nó
   § Qual o grau de cada nó mostrado anteriormente?
§ Conceito de Grau Máximo:
   § número máximo de sub-árvores que o nó pode ser raiz
§ Nós que não tem grau, são chamados de nós folhas
§ Para identificar os nós de uma estrutura, usamos a
  relação de hierarquia existente em uma árvore
  genealógica
   § Nó Filho, Nó pai, Nó neto, Nó irmão, ...
                                                           7
Nível e Altura

§ Conceito de Nível:
              Nível
   § Representa a distância de um nó até a raiz
      § Qual o nível do nó F (slide 6)?
§ Importante: o nó que apresentar o maior nível
  fornecerá a altura de uma árvore
   § Só existe um caminho da raiz para qualquer nó
§ O número de filhos permitido em cada nó e as
  informações armazenadas nestes nós e que
  diferenciam os diversos tipos de árvores existentes

                                                           8
Estrutura de Dados I




   Parte 2 :
Árvores Binárias

                             9
Conceitos

§ Em uma árvore binária, todos os seus nós possuem,
  no máximo, duas sub-árvores
   § Cada nó pode ter zero, um ou dois filhos.
   § E ainda, é uma árvore de grau máximo igual a dois.
§ As duas sub-árvores possíveis em cada nó são
  também denominadas de:
                                             Nó
   § sub-árvore esquerda (sae).
   § sub-árvore direita (sad).       sae            sad

§ Árvore binária completa
   § Árvore em que cada nó possui dois filhos (exceto os nós
     folhas, é claro).                                     10
Graficamente

§ Observe:
                                     Nó
                Esquerda                              Direita
Nível 1                    10                    20



Nível 2
                   30                     40           50



Nível 3                   60

                                                       Grau máximo = 2
§ Onde:
          ...           Raízes das sub-árvores

          ...           Nós folhas (grau = 0)                            11
Árvores binárias

                Pense um pouco...
§ O que você acha que seria necessário para
  implementar uma biblioteca de um novo TAD que
  representasse uma árvore binária?
  Πuma estrutura que guarde: dado e ponteiros
  • dois apontadores indicando: esquerda e a direita do nó
                          /* arvorebin.h */
                          /* arvorebin.h */
  /* estruturação */      Inicialização da árvore
                          Inicialização da árvore
  typedef struct arv {    Criar nó raiz
                          Criar nó raiz
    int info;
        info;             Árvore vazia
                          Árvore vazia
    struct arv *esq;      Imprimir a árvore
                          Imprimir a árvore
    struct arv *dir;      Inserir filho esquerdo
                          Inserir filho esquerdo
  }no;                    Inserir filho direito
                          Inserir filho direito
                          Remover um determinado nó
                          Remover um determinado nó      12
Considerações

§ Importante!
   § Uma árvore é representada pelo endereço do nó raiz
      § Uma árvore vazia é representada pelo valor NULL
   § O nível de uma árvore que contém apenas o nó raiz é 0
   § A altura de uma árvore vazia é negativa e vale -1
§ Percurso:
   § Um percurso define a ordem em que os nós de uma
     árvore serão processados
   § Trabalharemos com três tipos de percursos: Pré-ordem,
     In-ordem e Pós-ordem
                                                          13
Tipos de percursos

§ Algoritmos de percursos em árvores:
   Œ Pré-ordem                           // Algoritmo recursivo pre-ordem
                                         void preordem( arvore arv ) {
                                             if(!vazia( arv ){
      § Utiliza a raiz                           printf( “%d”, arv->info );
                                                 preordem( arv->esq );
      § Percorre a sub-árvore esquerda           preordem( arv->dir );
                                             }
      § Percorre a sub-árvore direita    }



   • In-ordem                            // Algoritmo recursivo in-ordem
                                         void inordem( arvore arv ) {

      § Percorre a sub-árvore esquerda       if(!vazia( arv ){
                                                 inordem( arv->esq );

      § Utiliza a raiz                           printf( “%d”, arv->info );
                                                 inordem( arv->dir );

      § Percorre a sub-árvore direita    }
                                             }



   Ž Pós-ordem                           // Algoritmo recursivo pos-ordem

      § Percorre a sub-árvore esquerda
                                         void posordem( arvore arv ) {
                                             if(!vazia( arv ){
                                                 posordem( arv->esq );
      § Percorre a sub-árvore direita            posordem( arv->dir );
                                                 printf( “%d”, arv->info );
      § Utiliza a raiz                       }
                                         }                                    14
Tipos de percursos

§ Observe:
                                A
           Esquerda                              Direita
Nível 1                   B                C



Nível 2
               D                       F          G



Nível 3               E

                                                  Grau máximo = 2
§ Percursos:
      Pré-ordem: A, B, D, E, C, F, G
      In-ordem: D, E, B, A, F, C, G
      Pós-ordem: E, D, B, F, G, C, A                                15
Algoritmos em C

§ O que deverá ser feito pelo aluno:
   § Escolha e instalação do ambiente a ser trabalhado no
     laboratório
   § Modelagem deste TAD (dados e operações)
   § Implementação dos algoritmos de operações básicas
     vistos em sala de aula na linguagem C
   § Utilização das regras de modelagem vistas no módulo
     anterior (criação de bibliotecas) e modularização
   § Implantação de código legível e bem documentado
   § Nomes de variáveis condizentes com o problema
   § Prática de laboratório
                                                            16
Para um bom aproveitamento:

§ O aluno deve identificar a relação entre TAD
  (biblioteca e modularização) com a implementação
  da fila no código!
§ Resolva todas as questões da prática de
  laboratório de árvores
§ Procure o professor ou monitor da disciplina e
  questione conceitos, listas, etc.
§ Não deixe para codificar tudo e acumular assunto
  para a primeira avaliação.
  § Este é apenas um dos assuntos abordados na prova!
                                                        17

Mais conteúdo relacionado

Mais de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Mais de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 07
Java 07Java 07
Java 07
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 

Árvores Binárias: Fundamentos e Implementações

  • 1. Curso Superior de Tecnologia em Telemática Programação e Estruturas de Dados Árvores – Fundamentos e Implementações Copyright©2010 Prof. César Rocha cesarocha@ifpb.edu.br 1
  • 2. Objetivos § Explorar os conceitos fundamentais acerca do uso de árvores utilizando a linguagem C § Organização e implementação, características, vantagens, desvantagens, regras de utilização, operações básicas e algoritmos de implementação § Será abordada ainda uma implementação de árvore bastante conhecida: árvore binária § Este módulo será utilizado como referência na entrega dos futuros projetos § Implementação das estruturas e algoritmos, criação das bibliotecas e práticas de laboratório 2
  • 3. Estrutura de Dados I Parte 1 : Fundamentos 3
  • 4. Motivação § Ao longo de todo o curso, temos examinado estruturas de dados que podem ser chamadas de unidimensionais ou lineares § Por exemplo: TADs que usam vetores e todas as listas. § A importância destes tipos de estruturas é incontestável, porém... § elas não são adequadas para representarmos dados que devem ser dispostos de maneira hierárquica § não faz sentido, por exemplo, representar uma árvore de diretórios de um sistema operacional utilizando um vetor linear e pré-dimensionado 4
  • 5. Conceitos § Uma árvore consiste de uma estrutura não-linear que representa uma relação de hierarquia § Uma árvore é composta por um conjunto de nós § Existe um nó R, chamado de nó raiz § Este nó contém zero ou mais sub-árvores, cujas raízes são ligadas diretamente à R § Os nós raízes das sub-árvores são ditos filhos do nó R § Nós que não têm filhos são chamados de folhas § É bastante comum desenhar as árvores com o nó raiz para cima e os nós folhas para baixo 5
  • 6. Graficamente TArvore *a Raiz Nó RAIZ Nó RAIZ Filho do nó A Filho do nó A Sub-árvores do nó RAIZ Sub-árvores do nó RAIZ A B C D F Nós folhas Nós folhas § Representamos explicitamente a direção dos ponteiros, na figura acima: § Eles apontam sempre do pai para os filhos § Diferente do exemplo acima, podemos ter nós contendo mais de duas sub-árvores 6
  • 7. Grau § O número de sub-árvores presentes em um determinado nó indicará o Grau desse nó § Qual o grau de cada nó mostrado anteriormente? § Conceito de Grau Máximo: § número máximo de sub-árvores que o nó pode ser raiz § Nós que não tem grau, são chamados de nós folhas § Para identificar os nós de uma estrutura, usamos a relação de hierarquia existente em uma árvore genealógica § Nó Filho, Nó pai, Nó neto, Nó irmão, ... 7
  • 8. Nível e Altura § Conceito de Nível: Nível § Representa a distância de um nó até a raiz § Qual o nível do nó F (slide 6)? § Importante: o nó que apresentar o maior nível fornecerá a altura de uma árvore § Só existe um caminho da raiz para qualquer nó § O número de filhos permitido em cada nó e as informações armazenadas nestes nós e que diferenciam os diversos tipos de árvores existentes 8
  • 9. Estrutura de Dados I Parte 2 : Árvores Binárias 9
  • 10. Conceitos § Em uma árvore binária, todos os seus nós possuem, no máximo, duas sub-árvores § Cada nó pode ter zero, um ou dois filhos. § E ainda, é uma árvore de grau máximo igual a dois. § As duas sub-árvores possíveis em cada nó são também denominadas de: Nó § sub-árvore esquerda (sae). § sub-árvore direita (sad). sae sad § Árvore binária completa § Árvore em que cada nó possui dois filhos (exceto os nós folhas, é claro). 10
  • 11. Graficamente § Observe: Nó Esquerda Direita Nível 1 10 20 Nível 2 30 40 50 Nível 3 60 Grau máximo = 2 § Onde: ... Raízes das sub-árvores ... Nós folhas (grau = 0) 11
  • 12. Árvores binárias Pense um pouco... § O que você acha que seria necessário para implementar uma biblioteca de um novo TAD que representasse uma árvore binária? Œ uma estrutura que guarde: dado e ponteiros • dois apontadores indicando: esquerda e a direita do nó /* arvorebin.h */ /* arvorebin.h */ /* estruturação */ Inicialização da árvore Inicialização da árvore typedef struct arv { Criar nó raiz Criar nó raiz int info; info; Árvore vazia Árvore vazia struct arv *esq; Imprimir a árvore Imprimir a árvore struct arv *dir; Inserir filho esquerdo Inserir filho esquerdo }no; Inserir filho direito Inserir filho direito Remover um determinado nó Remover um determinado nó 12
  • 13. Considerações § Importante! § Uma árvore é representada pelo endereço do nó raiz § Uma árvore vazia é representada pelo valor NULL § O nível de uma árvore que contém apenas o nó raiz é 0 § A altura de uma árvore vazia é negativa e vale -1 § Percurso: § Um percurso define a ordem em que os nós de uma árvore serão processados § Trabalharemos com três tipos de percursos: Pré-ordem, In-ordem e Pós-ordem 13
  • 14. Tipos de percursos § Algoritmos de percursos em árvores: Œ Pré-ordem // Algoritmo recursivo pre-ordem void preordem( arvore arv ) { if(!vazia( arv ){ § Utiliza a raiz printf( “%d”, arv->info ); preordem( arv->esq ); § Percorre a sub-árvore esquerda preordem( arv->dir ); } § Percorre a sub-árvore direita } • In-ordem // Algoritmo recursivo in-ordem void inordem( arvore arv ) { § Percorre a sub-árvore esquerda if(!vazia( arv ){ inordem( arv->esq ); § Utiliza a raiz printf( “%d”, arv->info ); inordem( arv->dir ); § Percorre a sub-árvore direita } } Ž Pós-ordem // Algoritmo recursivo pos-ordem § Percorre a sub-árvore esquerda void posordem( arvore arv ) { if(!vazia( arv ){ posordem( arv->esq ); § Percorre a sub-árvore direita posordem( arv->dir ); printf( “%d”, arv->info ); § Utiliza a raiz } } 14
  • 15. Tipos de percursos § Observe: A Esquerda Direita Nível 1 B C Nível 2 D F G Nível 3 E Grau máximo = 2 § Percursos: Pré-ordem: A, B, D, E, C, F, G In-ordem: D, E, B, A, F, C, G Pós-ordem: E, D, B, F, G, C, A 15
  • 16. Algoritmos em C § O que deverá ser feito pelo aluno: § Escolha e instalação do ambiente a ser trabalhado no laboratório § Modelagem deste TAD (dados e operações) § Implementação dos algoritmos de operações básicas vistos em sala de aula na linguagem C § Utilização das regras de modelagem vistas no módulo anterior (criação de bibliotecas) e modularização § Implantação de código legível e bem documentado § Nomes de variáveis condizentes com o problema § Prática de laboratório 16
  • 17. Para um bom aproveitamento: § O aluno deve identificar a relação entre TAD (biblioteca e modularização) com a implementação da fila no código! § Resolva todas as questões da prática de laboratório de árvores § Procure o professor ou monitor da disciplina e questione conceitos, listas, etc. § Não deixe para codificar tudo e acumular assunto para a primeira avaliação. § Este é apenas um dos assuntos abordados na prova! 17