Olá boa noite Estou com um pequeno problema num trabalho para a faculdade sobre árvores em C. Na função "consulta", estou com um problema, quando mando consultar um elemento pra verificar se está presente ou não na árvore, ele dá a mesma msg, de item não encontrado, mesmo ele estando presente na árvore. Ficaria muito grato com alguma ajuda, Atenciosamente.... #include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
int main();
void insere (struct no *&praiz, struct no *novo);
void emordem (struct no *raiz);
void preordem (struct no *raiz);
void posordem (struct no *raiz);
int pesquisa (struct no *aux1, int itemaux);
void remove (struct no *&aux1);
struct no
{
int item;
struct no *esq, *dir;
};
struct no *raiz, *aux1, *aux2;
int main()
{
char c, op = '1', auxitem[3];
int achou;
raiz = (struct no*) NULL; // inicializa a arvore vazia
while (op != '0')
{
system("cls");
puts(" Operacoes em Arvores Binarias de Busca\n\n");
puts("1. Inserir um item novo na arvore");
puts("2. Consultar um item na arvore");
puts("3. Remover um item da arvore");
puts("4. Imprimir a arvore em pre-ordem");
puts("5. Imprimir a arvore em ordem");
puts("6. Imprimir a arvore em pos-ordem");
puts("0. Sair");
printf("Entre com sua opcao: ");
op = getche();
switch(op)
{
case '1': // insere
{
aux1 = (struct no *) malloc(sizeof(struct no));
printf("\n\nEntre com o item a ser inserido: ");
gets(auxitem);
aux1->item = atoi(auxitem);
aux1->esq = aux1->dir = (struct no*) NULL;
if (raiz == (struct no *) NULL)
raiz = aux1;
else
{
aux2 = raiz;
insere(aux2, aux1);
}
}
break;
case '2': // consulta
{
if (raiz == (struct no *) NULL)
printf("\n\nImpossivel pesquisar. Arvore vazia !");
else
{
printf("\n\nEntre com o item a ser pesquisado: ");
gets(auxitem);
achou = pesquisa(raiz, (atoi(auxitem)));
if (achou)
puts("Não Achou !");
else puts ("Achou !");
}
}
break;
case '3': // remove
{
if (raiz == (struct no *) NULL)
printf("\n\nImpossivel remover. A arvore estah vazia !");
else
{
printf("\n\nEntre com o item a ser removido: ");
gets(auxitem);
achou = pesquisa(raiz, (atoi(auxitem)));
if (achou)
puts("Impossivel remover. O elemento não existe na arvore !");
else // acha o endereco a ser modificado e passa p/ a funcao remove
{
if (raiz->item == atoi(auxitem)) // remove o noh que estah
remove(raiz); // ocupando a raiz da arvore
else
{
aux1 = raiz;
while((aux1->dir->item != atoi(auxitem)) && (aux1->esq->item != atoi(auxitem)))
{
if (atoi(auxitem) <= aux1->item)
aux1 = aux1->esq;
else
aux1 = aux1->dir;
} // while
if (aux1->dir->item == atoi(auxitem))
remove(aux1->dir);
else
remove(aux1->esq);
} // else if raiz->item == auxitem
} // else if !achou
} // else if raiz == NULL
} // case '3'
break;
case '4': // imprime em pre ordem
{
printf("\n\nImprimindo os componentes em pre-ordem: ");
preordem(raiz);
}
break;
case '5': // imprime em ordem (central)
{
printf("\n\nImprimindo os componentes em ordem: ");
emordem(raiz);
}
break;
case '6': // imprime em pos ordem
{
printf("\n\nImprimindo os componentes em pos-ordem: ");
posordem(raiz);
}
break;
case '0': break;
default : puts("\nOpcao invalida");
} /* switch */
puts("\nPressione <ENTER> para continuar");
while ((c = getchar()) != '\n');
} /* while */
} /* funcao main () */
void insere (struct no *&praiz, struct no *novo)
{
if (praiz == (struct no *) NULL)
praiz = novo;
else
{
if (novo->item <= praiz->item)
insere(praiz->esq, novo);
else
insere(praiz->dir, novo);
}
}
int pesquisa (struct no *aux1, int itemaux)
{
if (aux1 == (struct no *) NULL) // não achou
return(0);
if (aux1->item == itemaux) // achou
return(1);
if (itemaux <= aux1->item)
pesquisa(aux1->esq, itemaux);
else
pesquisa(aux1->dir, itemaux);
} /* funcao pesquisa */
void remove (struct no *&aux1)
{
struct no *temp;
if (aux1->dir == (struct no *) NULL)
{
temp = aux1;
aux1 = aux1->esq;
free(temp);
}
else
if (aux1->esq == (struct no *) NULL)
{
temp = aux1;
aux1 = aux1->dir;
free(temp);
}
else // ambas as subarvores do noh a ser removido estao ocupadas
{
temp = aux1->dir;
while (temp->esq != (struct no *) NULL) // acha a posicao mais a
temp = temp->esq; // esquerda possivel na
// subarvore da direita
temp->esq = aux1->esq; // liga esta posicao com a subarvore
// esquerda do noh a ser removido
temp = aux1;
aux1 = aux1->dir; // faz a subarvore da direita assumir o lugar do
// noh a ser removido
free(temp);
}
} /* funcao remove */
void emordem (struct no *raiz)
{
if (raiz != (struct no *) NULL)
{
emordem(raiz->esq);
printf("%d ", raiz->item);
emordem(raiz->dir);
}
}
void preordem (struct no *raiz)
{
if (raiz != (struct no *) NULL)
{
printf("%d ", raiz->item);
preordem(raiz->esq);
preordem(raiz->dir);
}
}
void posordem (struct no *raiz)
{
if (raiz != (struct no *) NULL)
{
posordem(raiz->esq);
posordem(raiz->dir);
printf("%d ", raiz->item);
}
}Ps: O código está rodando no Dev C++.