Jump to content

[Resolvido] Imprimir Arvore


Joao Miguel
 Share

Recommended Posts

Boa noite.

Tenho uma estrutura de dados de uma arvore binaria (neste caso de nomes de autores inseridos por ordem alfabética) e uma função recursiva para imprimir os nomes dessa arvore de forma inorder.

Contudo, o tamanho da arvore é substancial (cerca de 1000 nomes) o que leva a que a impressão no ecrã se torne muito grande. Pretendia, portanto, que a função de imprimir, apresentá-se apenas os 10 primeiros nomes, esperando que o utilizador carregue no "espaço" para imprimir os 10 nomes seguintes e por aí em diante de formar inorder.

Apresento a estrutura de dados e a função de impressão:


typedef struct arv {
 char *nomeAutor;
 struct arv *esq, *dir;
} ARVORE_NOMES;


void imprime_arvore(ARVORE_NOMES *a) {
 if(a) {
	  imprime_arvore(a->esq);
	  printf("%s\n", a->nomeAutor);
	  imprime_arvore(a->dir);
 }
}

Não faço ideia como pegar no problema. É possível fazer utilizando a função recursiva de imprimir que apresentei ou terá de ser de forma iterativa? Qualquer ajuda é agradecida.

Obrigado.

Edited by Joao Miguel
Link to comment
Share on other sites

sim

int imprime_arvore(ARVORE_NOMES *a, int count) {
 if(a) {
   // apresenta os nós da esquerda
   count += imprime_arvore(a->esq, count);

   // verifica se já foram apresentados 10 nós
   if (count == 10) {
     // pedir para continuar
     printf("mais registos ...");
     while (getchar() != '\n') /*void */;
     count = 0;
   }

   // apresentar o nó actual
   printf("%s\n", a->nomeAutor);
   ++count;

   // apresentar os nós da direita
   count += imprime_arvore(a->dir, count);
 }

 return count;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Muito obrigado HappyHippyHippo.

O truque que não estava a pensar era passar o contador como argumento da própria função...

Devo dizer que te enganas-te numa pequena coisa no código que apresentas-te que é quando se faz: count += imprime_arvore(a->esq, count); que deve ficar apenas com o sinal de igualdade entre o count e a função (o mesmo acontece quando se faz para a arvore da direita).

Passo a por o código com esse erro corrigido:


int imprime_arvore(ARVORE_NOMES *a, int count) {
 if(a) {
	  count = imprime_arvore(a->esq, count);

	  if(count == 10) {
		   printf("Mais registos...");
		   while(getchar() != '\n');
		   count = 0;
	  }

	  printf("%s\n", a->nomeAutor);
	  ++count;

	  count = imprime_arvore(a->dir, count);
 }

 return count;
}

Mais uma vez muito obrigado

Edited by Joao Miguel
Link to comment
Share on other sites

Concordo plenamente até porque o que tenho de fazer na verdade é um pouco mais do que disse aqui mas esse bocado agora vai para a frente sem problemas nenhuns com a ajuda que deste.

Só referi para o caso de outras pessoas que precisem de algo igual e não consigam detectar aquele pequeno pormenor.

Obrigado.

Edited by Joao Miguel
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.