Ir ao conteúdo
  • Cadastre-se

Ajuda em programa C/C++


Posts recomendados


Alguém poderia me ajudar a implementar as funções PÓS-Ordem, Maior e Menor valor, e retirar nó?

Árvore binária

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

int quantidadeNos = 0;

typedef struct _no{

int chave;//Chave a ser guardada

int cont; // Contar repetição

struct _no *esq, *dir, *pai;

}no;

no* auxPai = NULL;

void vaziaArvore(no *raiz){

if (raiz == NULL){

printf("\tA arvore esta vazia\n\n");

}

else {

printf("\tA arvore nao esta vazia\n\n");

}

}

void insere (int x, no **p){

if (*p==NULL){

*p=(no *)malloc(sizeof(no));

(*p)->chave=x;

(*p)->dir=NULL;

(*p)->esq=NULL;

(*p)->pai = auxPai;

(*p)->cont=1;

}

else{

if (x<(*p)->chave){

if((*p)->esq == NULL)

auxPai = *p;

insere(x, &(*p)->esq);

}

if(x>(*p)->chave){

if((*p)->dir == NULL)

auxPai = *p;

insere(x, &(*p)->dir);

}

if(x == (*p)->chave){

(*p)->cont++;

return;

}

}

}

int contaNos(no *p){

if(p != NULL){

quantidadeNos ++;

contaNos(p -> dir);

contaNos(p -> esq);

}

return quantidadeNos;

}

no* busca(no *arvore, int x){

if (arvore == NULL)

return NULL;

if (x == arvore->chave)

return arvore;

if (x < arvore->chave)

return busca(arvore->esq, x);

else

return busca(arvore->dir, x);

}

void consultarDetalhes(no* raiz){

int num;

no* aux;

printf("Digite o numero procurado: ");

scanf("%d", &num);

aux = busca(raiz, num);

if (aux == NULL)

printf("Nao encontrado!\n");

else{

printf("Encontrado!\n");

printf("O numero %d foi repetido %d vezes.\n", num, aux->cont);

if(aux->pai == NULL){

printf("O No que contem o valor %d e a raiz da arvore.\n", num);

if(aux->esq != NULL)

printf("Valor contido no No filho a esquerda: %d\n", aux->esq->chave);

if(aux->dir != NULL)

printf("Valor contido no No filho a direito: %d\n", aux->dir->chave);

}

if((aux->esq == NULL)&&(aux->dir == NULL)&&(aux->pai != NULL)){

printf("O No que contem o valor %d e uma folha da arvore.\n", num);

printf("Valor contido no No pai: %d\n", aux->pai->chave);

}

if(((aux->esq != NULL)||(aux->dir != NULL))&&(aux->pai != NULL)){

printf("O No que contem o valor %d e um no interno a arvore.\n", num);

printf("Valor contido no No pai: %d\n", aux->pai->chave);

if(aux->esq != NULL)

printf("Valor contido no No filho a esquerda: %d\n", aux->esq->chave);

if(aux->dir != NULL)

printf("Valor contido no No filho a direito: %d\n", aux->dir->chave);

}

}

}

void imprime(no *p, int nivel){

int i;

if(p == NULL)

return;

imprime(p->dir, nivel+1);

for(i=0;i<nivel;i++)

printf(" ");

printf("%6d\n\n",p->chave);

imprime(p->esq,nivel+1);

}

void preordem (no *arvore){

if(arvore != NULL){

printf("%6d",arvore->chave);

preordem(arvore->esq);

preordem(arvore->dir);

}

}

void emordem(no *arvore){

if(arvore != NULL){

emordem(arvore->esq);

printf("%6d",arvore->chave);

emordem(arvore->dir);

}

}

int menu(){

int op;

printf("\n>>>>>>>>>>MENU<<<<<<<<<<\n\n");

printf("\t1 - Verificar status da Arvore\n");

printf("\t2 - Inserir valor\n");

printf("\t3 - Imprimir pre ordem\n");

printf("\t4 - Imprimir in-ordem\n");

printf("\t5 - Imprimir pos ordem\n");

printf("\t6 - Procurar um numero\n");

printf("\t7 - Consulta detalhada\n");

printf("\t8 - Consultar maior valor\n");

printf("\t9 - Consultar menor valor\n");

printf("\t10 - Tamanho da arvore\n");

printf("\t11 - Imprimir arvore\n");

printf("\t12 - Retirar elemento da arvores\n");

printf("\t13 - Sair\n\n>>>>>>>>>>MENU<<<<<<<<<<\n\n\n");

printf("Digite sua opcao: ");

scanf("%d", &op);

return op;

}

int main(){

int n,a,b;

no *raiz, *aux;

raiz = NULL;

int opcao;

while(opcao!=12){

system("cls");

opcao = menu();

switch(opcao){

case 1:

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

vaziaArvore(raiz);

printf(">>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

getch();

break;

case 2:

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n");

printf("\nDigite -1 para terminar\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

do{

printf("Digite um numero: ");

scanf("%d", &n);

if(n!=-1)

insere(n, &raiz);

}while (n!=-1);

system("cls");

printf(" ( ARVORE BINARIA )\n");

printf(" (o)\n");

printf(" (o) )((o)\n");

printf(" (o)(o)(o)(o)\n");

printf(" )||(\n");

printf(" __| |__\n\n\n");

imprime(raiz,0);

getch();

break;

case 3:

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf("------> Pre-Ordem <------\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

preordem(raiz);

getch();

break;

case 4:

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf("------> Em-Ordem <------\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

emordem(raiz);

getch();

break;

case 5:

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf("------> Pos-Ordem <------\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

// posordem(raiz); Implemntar Essa função.

getch();

break;

case 6:

system("cls");

printf("\n\nDigite o numero procurado: ");

scanf("%d",&a);

aux = busca(raiz,a);

if (aux == NULL){

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf(" Nao encontrado!\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

}

else{

system("cls");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf(" Encontrado!\n");

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

}

getch();

break;

case 7:

system("cls");

consultarDetalhes(raiz);

getch();

break;

case 8:

system("cls");

// maiorValor(raiz); // Função a ser implemntada, ir sempre apra a direita e imprimir o último valor antes de NULL

getch();

break;

case 9:

system("cls");

// menorValor(raiz);// Função a ser implemntada, ir sempre apra a esquerda e imprimir o último valor antes de NULL

getch();

break;

case 10:

system("cls");

b=contaNos(raiz);

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

printf(" A arvore possui %d nos, por tanto tamanho %d!\n",b,B);

printf("\n>>>>>>>>>>>>><<<<<<<<<<<<<\n\n");

getch();

break;

case 11:

system("cls");

printf("ARVORE BINARIA\n");

imprime(raiz,0);

getch();

break;

case 12:

system("cls");

printf("Informe o chave a ser retirada: \n");

scanf("%d",&a);

//retira(raiz,a); //A função retira deve retirar um nó da arvore obedecndo o algoritmo que está no slide, substituindo corretamente

getch();

break;

case 13:

exit(0);

break;

default :

system("cls");

printf("opcao nao existe! tente novamente");

getch();

break;

}

}

system("PAUSE");

return 0;

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...