Você está na página 1de 9

Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado.

Este material pode ser protegido por


direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

UNIVERSIDADE VEIGA DE ALMEIDA


GRADUAÇÃO EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
DISCIPLINA: ESTRUTURA DE DADOS
PROF.: PAULO MÁRCIO SOUZA FREIRE

EDUARDO FERREIRA TRINDADE

TRABALHO DA DISCIPLINA (AVA2)


BUSCA EM ÁRVORES BINÁRIAS

NITERÓI
2022
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

Trabalho da disciplina – AVA 2

(Transcrição do enunciado)

As árvores binárias de busca são estruturas de dados de árvore binária baseada em


nós em que todos os nós da subárvore esquerda possuem um valor numérico
inferior ao nó raiz e todos os nós da subárvore direita possuem um valor superior ao
nó raiz (FORBELLONE; EBERSPACHER, 2005).

A Empresa Renalf S/A solicita a você, membro da equipe de programadores de


computador em linguagem C, que desenvolva um programa que seja capaz de
manipular uma árvore binária (inclusão e remoção de nós), admitindo a escolha dos
três processos de busca em profundidade.

Procedimentos para elaboração do TD

Nesse contexto, escreva um programa em linguagem C que apresente um menu de


opções que possibilite executar as seguintes opções:

* * * MENU DE OPÇÕES * * *

1. Incluir nó.
2. Remover nó.
3. Buscar pré-ordem.
4. Buscar em ordem.
5. Buscar pós-ordem.
Opção [0 para encerrar]1

1 Enunciado da segunda avaliação disponível em:

https://uva.instructure.com/courses/31426/assignments/89453?module_item_id=496574 acessado em:


19/11/2022.
2
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

BUSCA EM ÁRVORES BINÁRIAS

#include <stdio.h>
#include <stdlib.h>

typedef struct no {
int valor;
struct no *esquerda, *direita;
} NoArvore;

NoArvore *inserir_no(NoArvore *raiz, int num) {


if (raiz == NULL) {
NoArvore *aux = malloc(sizeof(NoArvore));
aux->valor = num;
aux->esquerda = NULL;
aux->direita = NULL;
printf("\n-------------------------\n");
printf("No INSERIDO com sucesso!\n");
printf("-------------------------\n");
return aux;
}
else {
if (num < raiz->valor) {
raiz->esquerda = inserir_no(raiz->esquerda, num);
}
else {
raiz->direita = inserir_no(raiz->direita, num);
}
return raiz;
}
}

NoArvore* remover(NoArvore *raiz, int chave) {


if (raiz == NULL) {
printf("\n-------------------------\n");
printf("Valor NAO ENCONTRADO na arvore !\n");
printf("-------------------------\n");
return NULL;
}
else {
if (raiz->valor == chave) {
// remover nó folha (sem filhos)

3
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

if (raiz->esquerda == NULL && raiz->direita == NULL)


{
free(raiz);
printf("\n-------------------------\n");
printf("No REMOVIDO com sucesso!\n");
printf("-------------------------\n");
return NULL;
}
else {
// remover nós com 2 filhos
if (raiz->esquerda && raiz->direita) {
NoArvore *aux = raiz->esquerda;
while (aux->direita) {
aux = aux->direita;
}
raiz->valor = aux->valor;
aux->valor = chave;
raiz->esquerda = remover(raiz->esquerda,
chave);
return raiz;
}
else {
// remover nós com apenas 1 filho
NoArvore *aux;
if (raiz->esquerda) {
aux = raiz->esquerda;
}
else {
aux = raiz->direita;
}
free(raiz);
printf("\n-------------------------\n");
printf("No REMOVIDO com sucesso!\n");
printf("-------------------------\n");
return aux;
}
}
}
else {
if (chave < raiz->valor) {
raiz->esquerda = remover(raiz->esquerda, chave);
}
else {
raiz->direita = remover(raiz->direita, chave);
}

4
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

return raiz;
}
}
}

void busca_pre_ordem(NoArvore *raiz) {


if (raiz) {
printf("%d ", raiz->valor);
busca_pre_ordem(raiz->esquerda);
busca_pre_ordem(raiz->direita);
}
}

void busca_em_ordem(NoArvore *raiz) {


if (raiz) {
busca_em_ordem(raiz->esquerda);
printf("%d ", raiz->valor);
busca_em_ordem(raiz->direita);
}
}

void busca_pos_ordem(NoArvore *raiz) {


if (raiz) {
busca_pos_ordem(raiz->esquerda);
busca_pos_ordem(raiz->direita);
printf("%d ", raiz->valor);
}
}

int main() {
NoArvore *raiz = NULL;
int opcao, valor;

while (1) {
printf("\n\t[ 1 ] Inserir No\n"
"\t[ 2 ] Remover No\n"
"\t[ 3 ] Buscar Pre-ordem\n"
"\t[ 4 ] Buscar em ordem\n"
"\t[ 5 ] Buscar pos-ordem\n"
"\t[ 0 ] Sair\n\n");

printf("Digite o numero da opcao: ");


scanf("%d", &opcao);

switch (opcao) {

5
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

case 1:
printf("Digite um valor: ");
scanf("%d", &valor);
raiz = inserir_no(raiz, valor);
break;

case 2:
printf("Digite um valor a ser removido: ");
scanf("%d", &valor);
raiz = remover(raiz, valor);
break;

case 3:
if (raiz) {
printf("\n-------------------------\n"
"Busca Pre-ordem: ");
busca_pre_ordem(raiz);
printf("\n-------------------------\n");
}
else {
printf("\n-------------------------\n");
printf("Arvore Vazia!\n");
printf("-------------------------\n");
}
break;

case 4:
if (raiz) {
printf("\n-------------------------\n"
"Busca Pre-ordem: ");
busca_em_ordem(raiz);
printf("\n-------------------------\n");
}
else {
printf("\n-------------------------\n");
printf("Arvore Vazia!\n");
printf("-------------------------\n");
}
break;

case 5:
if (raiz) {
printf("\n-------------------------\n"
"Busca Pre-ordem: ");
busca_pos_ordem(raiz);

6
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

printf("\n-------------------------\n");
}
else {
printf("\n-------------------------\n");
printf("Arvore Vazia!\n");
printf("-------------------------\n");
}
break;

case 0:
printf("\n-------------------------\n");
printf("Programa Finalizado!\n");
printf("-------------------------\n");
exit(0);

default:
printf("\n-------------------------\n");
printf("Opcao Invalida!\n");
printf("-------------------------\n");
break;
}
}
return 0;
}

7
Impresso por Marina Pacheco, E-mail marinanathalie25@gmail.com para uso pessoal e privado. Este material pode ser protegido por
direitos autorais e não pode ser reproduzido ou repassado para terceiros. 06/11/2023, 16:52:31

Referências Bibliográficas:

BOENTE, Alfredo Nazareno Pereira. Estrutura de dados [livro eletrônico]. Rio de


Janeiro: UVA, 2019. 91 p. Disponível em:
https://uva.instructure.com/courses/31426/modules/items/496561. Acesso em: 19
nov. 2022.

Você também pode gostar