Árvores Binárias
De Aulas
Links relacionados: DAS5102 Fundamentos da Estrutura da Informação
Conteúdo
Arquivo arvore.c
1#include "stdlib.h"
2#include "arvore.h"
3
4typedef struct no No;
5
6struct no
7{
8 int conteudo;
9 No* pai;
10 No* filhoEsquerda;
11 No* filhoDireita;
12};
13
14struct arvore
15{
16 No* raiz;
17 int tamanho;
18};
19
20Arvore* arvore_criar()
21{
22 Arvore *a = (Arvore*) malloc(sizeof(Arvore));
23 a->raiz = NULL;
24 a->tamanho = 0;
25 return a;
26}
27
28No* no_criar(int valor)
29{
30 No* no = (No*) malloc(sizeof(No));
31 no->conteudo = valor;
32 no->pai = NULL;
33 no->filhoEsquerda = NULL;
34 no->filhoDireita = NULL;
35 return no;
36}
37
38int arvore_recursivo(Arvore* a, No* local, No* novo)
39{
40 if (novo->conteudo == local->conteudo)
41 {
42 free(novo);
43 return 1;
44 }
45 if (novo->conteudo < local->conteudo)
46 {
47 if (local->filhoEsquerda == NULL)
48 {
49 local->filhoEsquerda = novo;
50 return 0;
51 }
52 return arvore_recursivo(a, local->filhoEsquerda, novo);
53 }
54 if (local->filhoDireita == NULL)
55 {
56 local->filhoDireita = novo;
57 return 0;
58 }
59 return arvore_recursivo(a, local->filhoDireita, novo);
60}
61
62int arvore_eh_repetido(Arvore* a, int valor)
63{
64 No* no = no_criar(valor);
65 if (a->raiz == NULL)
66 {
67 a->raiz = no;
68 a->tamanho++;
69 return 0;
70 }
71 return arvore_recursivo(a, a->raiz, no);
72}
Arquivo arvore.h
1#ifndef ARVORE_H_INCLUDED
2#define ARVORE_H_INCLUDED
3
4typedef struct arvore Arvore;
5
6Arvore* arvore_criar();
7int arvore_eh_repetido(Arvore* a, int valor);
8
9#endif // ARVORE_H_INCLUDED
Arquivo main.c
1#include <stdio.h>
2#include <stdlib.h>
3#include "arvore.h"
4
5int main()
6{
7 int i;
8 int vet[9] = { 4, 3, 6, 5, 4, 9, 9, 1, 2};
9 Arvore* arvore = arvore_criar();
10
11 for (i = 0; i < 9; i++)
12 {
13 int repetido = arvore_eh_repetido(arvore, vet[i]);
14 if (repetido)
15 {
16 printf("%d eh repetido\n", vet[i]);
17 }
18 else
19 {
20 printf("%d nao eh repetido\n", vet[i]);
21 }
22 }
23 return 0;
24}
Roteiro
Objetivos
- Fixar o conceito de árvores binárias via exercícios práticos;
- Exercitar a descrição da funcionalidade de funções;
Atividade
1. Baseado no exemplo, tente refazer a função sem utilizar recursividade. Faça uma função para navegar na árvore e outra para apagar os nós sem recursividade.
2. Crie uma TAD que implemente uma árvore binária com as seguintes características:
- A árvore deve ser dinâmica;
- Os nós devem ser alocados de maneira dinâmica (usando malloc);
- Programe a estrutura de dados necessária para a implementação da árvore binária (visto em sala de aula);
- Escreva uma função para a criação da TAD árvore binária;
- Implemente a seguinte interface para esta TAD:
1#ifndef ARVORE_H
2#define ARVORE_H
3
4Arvore* arvore_criar();
5void arvore_destruir(Arvore *a)
6void arvore_inserir_esquerda(Arvore *a, int info);
7void arvore_inserir_direita(Arvore *a, int info);
8No *arvore_remover_esquerda(Arvore *a);
9No *arvore_remover_direita(Arvore *a,
10arvore *arvore_merge(Arvore *esquerda, arvore *direita);
11int arvore_tamanho(Arvore *a);
12No *arvore_raiz(Arvore *a);
13Arvore *arvore_esquerda(Arvore *a);
14Arvore *arvore_direita(Arvore *a);
15
16#endif /* ARVORE_H */
- No início de cada função, inclua um comentário descrevendo o que cada uma das funções acima deve fazer. Utilize o bom senso, discuta com os colegas de equipe e então valide com o professor de lab. o que cada uma das funções deve fazer.