Opa, tudo jóia ? Então, alguns erros que eu notei dando uma olhada rápida: 1º - Você está considerando que o Arvore->Item seja char nas funções xxxOrdem, sendo que ele é int. 2º - Esse é o seu principal erro, quando você aloca memória na função insere_elemento(), você está alocando para a variável *p, e não para a árvore. Basta mudar o código para esse: if(*arvore == NULL){
(*arvore) = (TREE *)malloc(sizeof(TREE));
(*arvore)->item = item;
(*arvore)->esq = NULL;
(*arvore)->dir = NULL; Vou tentar te explicar o que ocorre com esse erro. Primeiro você declara a variável *p, depois atribui o endereço de *arvore nela. Só que quando você aloca memória para *p, você simplesmente perde a referencia que tinha da variável *arvore e coloca um outro endereço para a variável *p. Isso não aconteceria se você fizesse algo assim: p->left = malloc(); pois aí sim você está dando um endereço de memória para um ponteiro que está na variável *arvore. Se houver algo de errado além disso no seu código é só dar um toque aqui que eu dou uma olhada para você, mas olhando superficialmente é só isso mesmo. []'s