Auxílio a prova de ARVORES BINÁRIAS E RECURSIVIDADE

Postando um exemplo de arvores aonde criamos 2 arvores com o intúito de auxiliar a prova.

Primeiro temos uma forma de revisarmos como fazer o script de criar uma arvore específica.

Segundo caso é o de criar uma arvore defeituosa e em seguida deixar-la perfeita (seria pegar os espaços em branco, pedaços aonde não possuem folhas e adicionar aonde falta).

  • main.c

#include <stdio.h>

#include <stdlib.h>

#include “arvore.h”

int main()

{

int maior=NULL;

int menor=NULL;

arvore auxDaArvore;

arvore novaArvore;

system(“cls”);

novaArvore = inicializa();

auxDaArvore = novaArvore ;

// criando a raiz da árvore

novaArvore = constroi(1);

// criando 2 folhas esquerda e direita

criafilhoesquerdo(novaArvore,2);

criafilhodireito(novaArvore,3);

//vamos andar um nível(esquerda) para baixo da árvore, para andarmos na árvore usamos o Auxiliar da Arvore(auxDaArvore)

// local aonde vai receber a posicao = função do lado a se locomover ( posicao atual );

auxDaArvore = filhoesq(novaArvore);

// agora que nos locomovemos para esqueda e um nivel a mais podemos criar os outros elementos (4,5)

criafilhoesquerdo(auxDaArvore,4);

criafilhodireito(auxDaArvore,5);

//agora que acabamos de locomovermos pelo lado esquerdo da árvore temos que voltar a raiz para podermos

//ir para o lado direito da árvore

auxDaArvore = novaArvore;

//temos que locomovermos uma posicao para continuar a adição de elementos pois já existe o elemento da

//direita da arvore(folha direita da raiz)

auxDaArvore=filhodir(novaArvore);

//agora estamos prontos para criar os filhos esquerdo e direito (7,6)

criafilhoesquerdo(auxDaArvore,7);

criafilhodireito(auxDaArvore,6);

//agora vamos imprimir em todos os tipos, informaremos como argumento a árvore (novaArvore)

printf(“Imprimindo em PREORDEM \n”);

preordem(novaArvore);

printf(“\n\nImprimindo em INORDEM\n”);

inordem(novaArvore);

printf(“\n\nImprimindo em POSORDEM\n”);

posordem(novaArvore);

printf(“\n\n\n\n”);

verificaSeMaiorOuMenor(novaArvore,&maior,&menor);

printf(“Item de maior valor : %d \n”,maior);

printf(“Item de menor valor : %d \n”,menor);

printf(“\n\n\n\n\n\n\n\n\n”);

printf(“Criando esta arvore \n”

3 \n”

/ \\ \n”

5 6 \n”

/ \\ / \\ \n”

11 2 9 21 \n”

\\ \\ \n”

40 22 \n”);

arvore arv;

arvore aux;

arv = inicializa();

arv = constroi(3);

aux = arv;

criafilhoesquerdo(aux,5);

criafilhodireito(aux,6);

aux = filhoesq(arv);

criafilhoesquerdo(aux,11);

criafilhodireito(aux,2);

aux = filhodir(aux);

criafilhodireito(aux,40);

aux = filhodir(arv);

criafilhoesquerdo(aux,9);

criafilhodireito(aux,21);

aux = filhodir(aux);

criafilhodireito(aux,22);

printf(“Imprimindo em PREORDEM \n”);

preordem(arv);

printf(“\n\nImprimindo em INORDEM\n”);

inordem(arv);

printf(“\n\nImprimindo em POSORDEM\n”);

posordem(arv);

printf(“\n\n\n\n”);

verificaSeMaiorOuMenor(arv,&maior,&menor);

printf(“Item de maior valor : %d \n”,maior);

printf(“Item de menor valor : %d \n”,menor);

printf( “\nDepois tornando ela perfeita\n”

3 \n”

/ \\ \n”

5 6 \n”

/ \\ / \\ \n”

11 2 9 21 \n”

/ \\ / \\ / \\ / \\ \n”

12 13 39 40 10 12 23 22 \n”);

aux = filhoesq(arv);

aux = filhoesq(aux);

criafilhoesquerdo(aux,12);

criafilhodireito(aux,13);

aux = filhoesq(arv);

aux = filhodir(aux);

criafilhoesquerdo(aux,39);

aux = filhodir(arv);

aux = filhoesq(aux);

criafilhoesquerdo(aux,10);

criafilhodireito(aux,12);

aux=filhodir(arv);

aux =filhodir(aux);

criafilhoesquerdo(aux,23);

printf(“Imprimindo em PREORDEM \n”);

preordem(arv);

printf(“\n\nImprimindo em INORDEM\n”);

inordem(arv);

printf(“\n\nImprimindo em POSORDEM\n”);

posordem(arv);

printf(“\n\n\n\n”);

verificaSeMaiorOuMenor(arv,&maior,&menor);

printf(“Item de maior valor : %d \n”,maior);

printf(“Item de menor valor : %d \n”,menor);

return 0;

}

  • arvore.c

#include “arvore.h”

noarv* inicializa(void) {

return NULL;

}

//Verificar se a árvore está vazia

int vazia(arvore arv) {

return (arv == NULL);

}

//Criação de um nó da árvore

/* cria um novo no do tipo arvore e retorna um ponteiro para a arvore criada */

noarv* constroi(int info){

noarv *novo;

if ((novo = aloca()) == NULL)

return NULL;

novo->dado = info;

novo->esq = NULL;

novo->dir = NULL;

return(novo);

}

//Criar filho esquerdo

/* Verifica se a arvore nao esta nula ou se se tem filho esquerdo.

Caso nao tenha filho esquerdo, sera construido um novo no a partir da

arvore passada como parametro */

int criafilhoesquerdo(arvore arv, int info){

noarv *novo;

if (arv == NULL)

return ERRO;

else if (arv->esq != NULL)

return ERRO;

else {

novo = constroi(info);

arv->esq = novo;

}

return OK;

}

//Alocar um nodo para a árvore

noarv* aloca(void) {

return ( (noarv*) malloc(sizeof(noarv)));

}

//Criar filho direito

/* Verifica se a arvore nao esta nula ou se se tem filho direito. Caso nao

tenha filho direito, sera construido um novo no a partir da arvore passada

como parametro */

int criafilhodireito(arvore arv, int info){

noarv *novo;

if (arv == NULL)

return ERRO;

else if (arv->dir != NULL)

return ERRO;

else {

novo = constroi(info);

arv->dir = novo;

}

return OK;

}

//Ir para o filho esquerdo

/* Caminha para o filho esquerdo da arvore passada como parametro, retornando

o endereco deste no’ */

noarv* filhoesq(arvore arv) {

if (vazia(arv))

return NULL;

else

return ( arv->esq );

}

//Ir para o filho direito de uma árvore

/* Caminha para o filho direito da arvore passada como parametro, retornando

o endereco deste no’ */

noarv* filhodir(arvore arv) {

if (vazia(arv))

return NULL;

else

return ( arv->dir );

}

//Pesquisar um nodo

int busca( arvore arv, int info ) {

if (vazia(arv))

return ERRO; // Nao encontrou o nodo

if ( info == arv->dado)

return OK;

else if (busca(arv->esq, info))

return OK;

else

return busca(arv->dir, info);

}

//Imprimir a árvore em pré-ordem

/* Esta procedure deve percorrer recursivamente a arvore, visitando todos

os nos e imprimindo sua informação, segundo o percurso em pré-ordem */

void preordem(arvore arv) {

if (!vazia(arv)) {

printf(“%d\t”, arv->dado);

preordem(arv->esq);

preordem(arv->dir);

}

}

//Imprimir a árvore em in-ordem

/* Esta procedure deve percorrer recursivamente a arvore, visitando todos

os nos e imprimindo sua informação, segundo o percurso em in-ordem */

void inordem(arvore arv) {

if (!vazia(arv)) {

inordem(arv->esq);

printf(“%d\t”, arv->dado);

inordem(arv->dir);

}

}

//Imprimir a árvore em pós-ordem

/* Esta procedure deve percorrer recursivamente a arvore, visitando todos

os nos e imprimindo sua informação, segundo o percurso em pós-ordem */

void posordem(arvore arv) {

if (!vazia(arv)) {

posordem(arv->esq);

posordem(arv->dir);

printf(“%d\t”, arv->dado);

}

}

int buscarMaior(arvore arv , int *maior){

if (vazia(arv)) return 0;

if (maior ==NULL)

maior = arv->dado;

if (*maior < arv->dado)

*maior = arv->dado;

buscarMaior(arv->esq,maior);

buscarMaior(arv->dir,maior);

return 1;

}

int verificaSeMaiorOuMenor(arvore novaArvore,int *maior,int *menor){

if(vazia(novaArvore))

return 0;

if (*maior == NULL && *menor==NULL){

*maior = *menor = novaArvore ->dado;

}

if(novaArvore->dado > *maior){

*maior= novaArvore->dado;

}else{

if(novaArvore->dado < *menor){

*menor= novaArvore->dado;

}

}

verificaSeMaiorOuMenor(novaArvore->esq, maior,menor);

verificaSeMaiorOuMenor(novaArvore->dir,maior,menor);

return 1;

}

  • Arvore.h

#include<malloc.h>

#include<stdio.h>

#define ERRO 0

#define OK 1

typedef struct stnoarvore {

int dado;

struct stnoarvore *esq;

struct stnoarvore *dir;

}noarv;

typedef noarv* arvore;

noarv* inicializa(void);

int vazia(arvore);

noarv* constroi(int);

int criafilhoesquerdo(arvore,int);

noarv* aloca(void);

int criafilhodireito(arvore,int);

noarv* filhoesq(arvore);

noarv* filhodir(arvore);

int busca(arvore,int);

void preordem(arvore);

void inordem(arvore);

void posordem(arvore);

int verificaSeMaiorOuMenor(arvore,int *,int *);

int buscarMaior(arvore,int*);

~ por strubloid em Junho 20, 2008.

Deixe uma resposta