Escolar Documentos
Profissional Documentos
Cultura Documentos
Departamento de Computação
Autor
792238
Ciência da Computação
Nesta atividade, foi proposta uma Árvore Binária de Busca. Esta estrutura é do tipo
árvore binária baseada em nós, em que todos os nós da subárvore esquerda possuem valor
numérico menor ao nó raiz e todos os nós da subárvore direita possuem valor numérico
maior ao nó raiz. A utilização desta estrutura é interessante pois proporciona agilidade
em consultas, sendo estas grande ou pequenas. As condições para ser considerada uma
ABB são:
A ABB possui como operações primitivas a de Cria(), responsável por criar a árvore,
destrói(), responsável por destruir a árvore, vazia(), responsável por verificar se a árvore
esta vazia, estaNaArvore(), responsável por verificar se determinado elemento esta na
árvore, insere(), responsável por inserir um elemento caso este elemento ainda não esteja
na árvore e remove(), que é responsável por remover um elemento caso este se encontre
na árvore.
Um exemplo de uma Árvore Binária de Busca pode ser encontrada na imagem abaixo:
2. Descrição da execução das atividades
#ifndef ABB_H
#define ABB_H
#include <stdbool.h>
struct Node{
int info;
struct Node *dir;
struct Node *esq;
};
ArvoreBinaria *cria();
#endif //ABB_H
#include "ABB.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
return R;
}
ArvoreBinaria *Remove(ArvoreBinaria *R, int X, bool *ok) {
if (!estaNaArvore(R, X)) {
*ok = false;
return R;
} else {
if (R != NULL) {
if (X > R->info) {
R->dir = Remove(R->dir, X, ok);
} else if (X < R->info) {
R->esq = Remove(R->esq, X, ok);
} else {
if (R->esq == NULL && R->dir == NULL) {//No sem
filhos
free(R);
*ok = true;
return NULL;
} else if (R->esq == NULL && R->dir != NULL) {//No
com um filho na direita
ArvoreBinaria *aux = R->dir;
free(R);
*ok = true;
return aux;
} else if (R->esq != NULL && R->dir == NULL) {//No
com um filho na esqueda
ArvoreBinaria *aux = R->esq;
free(R);
*ok = true;
return aux;
} else {//No com dois filhos.
ArvoreBinaria *aux = R->dir;
while (aux->esq != NULL) {
aux = aux->esq;
}
int auxRemove = aux->info;
R = Remove(R, auxRemove, ok);
R->info = auxRemove;
*ok = true;
}
}
return R;
}
}
return NULL;
}
Por fim, segue o trecho de código “main.c”, que contem a implementação das duas
funções extras e os testes do TAD:
#include <stdio.h>
#include "ABB.h"
int main() {
bool ok;
ArvoreBinaria *ABB1 = cria();
int X, op = 10;
while(op != 0){
printf("-- MENU -- (1) VAZIA -- (2) DESTROI -- (3) INSERE -
- (4) REMOVE -- (5) IMPRIME -- (6) FILHOS UNICOS\n");
scanf("%d", &op);
if(op == 1){
if(vazia(ABB1)){
printf("Arvore vazia.\n");
}
else{
printf("Arovre n vazia.\n");
}
}
else if(op == 2){
if(vazia(ABB1)){
printf("Arvore vazia.\n");
}
else{
destroi(ABB1);
printf("Arvore destruida.\n");
}
}
else if(op == 3){
printf("Digite o valor de X a ser inserido: ");
scanf("%d", &X);
ABB1 = insere(ABB1, X, &ok);
if(ok){
printf("Elemento %d inserido.\n", X);
}
else{
printf("Elemento %d n inserido pois ja esta na
arvore.\n", X);
}
}
else if(op == 4){
printf("Digite o valor de X a ser removido: ");
scanf("%d", &X);
ABB1 = Remove(ABB1, X, &ok);
if(ok){
printf("Elemento %d removido.\n", X);
}
else{
printf("Elemento %d nao esta na arvore.\n", X);
}
}
else if(op == 5){
imprimeTodos(ABB1);
printf("\n");
}
else if(op == 6){
int qtdNosUnicos = 0;
nmrNosUmFilho(ABB1, &qtdNosUnicos);
return 0;
}