Para ajudar a depurar os programas, fiz este codigo que imprime uma arvore (que nao seja muito grande). Realmente ajuda bastante.Existe uma solucao para grafos que se chama Graphviz./*#include "imprimeArvore.h"*/#include #include #define OK 0#define OVERFLOW 1#define UNDERFLOW -1typedef struct cel{ char info; struct cel * filhoEsq; struct cel * filhoDir;} noh;/* Esta e a estrutura de um elemento da fila */typedef struct elementoDaFila{ char info; noh *filhoEsq; noh *filhoDir; struct elementoDaFila *prox;} enfileirado;/* Funcoes de manipulacao da fila */void copiaCampos(noh origem, enfileirado* destino){ if(destino == NULL) fprintf(stderr, "\n\nErro: o destino da copia e null\n\n"); else { destino->info = origem.info; destino->filhoEsq = origem.filhoEsq; destino->filhoDir = origem.filhoDir; }}void copiaCampos2(enfileirado origem, noh* destino){ if(destino == NULL) fprintf(stderr, "\n\nErro: o destino da copia e null\n\n"); else { destino->info = origem.info; destino->filhoEsq = origem.filhoEsq; destino->filhoDir = origem.filhoDir; }}void enfileira(noh novoNo, enfileirado** primeiro, enfileirado** ultimo){ enfileirado* novo = malloc(sizeof(enfileirado)); copiaCampos(novoNo, novo); if(filaVazia(*primeiro, *ultimo)) { *primeiro = novo; *ultimo = novo; } else { (*ultimo)->prox = novo; *ultimo = novo; }}int proximo(noh* devolvido, enfileirado** primeiro, enfileirado** ultimo){ if(!filaVazia(*primeiro, *ultimo)) { copiaCampos2(**primeiro, devolvido); if((*primeiro)->prox == NULL) *ultimo = NULL; *primeiro = (*primeiro)->prox; return OK; } else { devolvido = NULL; return UNDERFLOW; }}int filaVazia(enfileirado* primeiro, enfileirado* ultimo){ return primeiro == NULL;}/* funcoes auxiliares */void imprimeVarios(char c, int quantidade){ while(quantidade > 0) { printf("%c", c); quantidade--; }}int maximo(int um, int outro){ if(um > outro) return um; return outro;}int achaAltura(noh raiz){ int alturaDir; int alturaEsq; alturaDir = 0; alturaEsq = 0; if(raiz.filhoEsq != NULL) alturaEsq = achaAltura(*(raiz.filhoEsq)); if(raiz.filhoDir != NULL) alturaDir = achaAltura(*(raiz.filhoDir)); return maximo(alturaEsq, alturaDir) + 1;}/* so serve pra expoente nao-negativo */int potencia(int base, int expoente){ if(expoente == 0) /* supondo que zero elevado a zero e 1 */ return 1; if(base == 0) return 0; return base*potencia(base, expoente-1);}/* Funcao para a impressao de uma arvore binaria */void imprimeArvoreBinaria(noh raiz){ int i; int nivel; /* nivel atual */ int altura; int numFolhas; /* numero de folhas que teria a arvore se ela fosse cheia */ int d; /* esta variavel guarda o numero de folhas que teria uma arvore cheia com altura igual a altura da arvore - nivel atual.*/ /* variaveis da fila */ enfileirado *primeiro; enfileirado *ultimo; noh *temp; noh *espaco; /* usado para "preencher" buracos na arvore, pois ela pode nao ser cheia, mas devemos ter um no ficticio no lugar*/ espaco = malloc(sizeof(noh)); espaco->info = ' '; espaco->filhoEsq = NULL; espaco->filhoDir = NULL; temp = malloc(sizeof(noh)); primeiro = NULL; ultimo = NULL; altura = achaAltura(raiz); numFolhas = potencia(2, altura-1); d = numFolhas; nivel = 1; enfileira(raiz, &primeiro, &ultimo); while(nivel <= altura) { /* gambiarra's.. */ if(d == 1) d = 0; /* imprimindo a linha com as infos */ for(i = 0; i < potencia(2,nivel-1); i++) { if(proximo(temp, &primeiro, &ultimo) == UNDERFLOW) fprintf(stderr, "poatz... underflow mano..."); imprimeVarios(' ', d); if(temp->info == ' ') imprimeVarios(' ', d-2); else imprimeVarios('_', d-2); if(temp == NULL || temp->info == '\0') printf(" "); else printf("%c", temp->info); if(temp->info == ' ') imprimeVarios(' ', d-2); else imprimeVarios('_', d-2); /* se for a ultima iteracao... */ if(i == potencia(2,nivel-1)-1) printf("\n"); else imprimeVarios(' ', d+3);