fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. struct no
  6. {
  7. int chave;
  8. struct no *esq, *dir;
  9. };
  10. typedef struct no No;
  11.  
  12.  
  13. No* cria_no(int chave);
  14. No* insere_no(int chave, No* raiz);
  15. int alturaArvore(No* );
  16. void mostrarNivel(No*, int, int);
  17.  
  18.  
  19. No* cria_no(int chave)
  20. {
  21. No* novo = (No*) malloc(sizeof(No));
  22. novo->chave = chave;
  23. novo->esq = novo->dir = NULL;
  24. return novo;
  25. }
  26.  
  27. No* insere_no(int chave, No* raiz)
  28. {
  29. No* novo = cria_no(chave);
  30. No* pai, *aux;
  31.  
  32. if (raiz == NULL)
  33. {
  34. raiz = novo;
  35. }
  36. else
  37. {
  38. aux = raiz;
  39. while (aux != NULL)
  40. {
  41. pai = aux;
  42. if (chave < aux->chave)
  43. aux = aux->esq;
  44. else
  45. {
  46. aux = aux->dir;
  47. }
  48.  
  49. }
  50. if(chave < pai->chave)
  51. pai->esq = novo;
  52. else
  53. {
  54. pai->dir = novo;
  55. }
  56.  
  57. }
  58. return raiz;
  59. }
  60.  
  61.  
  62. int nivelArvore(No *raiz)
  63. {
  64. if (raiz == NULL)
  65. {
  66. return 0;
  67. }
  68. else
  69. {
  70. int alturaEsquerda = nivelArvore(raiz->esq);
  71. int alturaDireita = nivelArvore(raiz->dir);
  72.  
  73. if (alturaEsquerda > alturaDireita)
  74. {
  75. return alturaEsquerda + 1;
  76. }
  77. else
  78. {
  79. return alturaDireita + 1;
  80. }
  81. }
  82. }
  83.  
  84. void mostrarNivel(No* raiz, int nivelAtual, int nivelAlvo)
  85. {
  86. if (raiz == NULL)
  87. {
  88. return;
  89. }
  90. if (nivelAtual == nivelAlvo)
  91. {
  92. printf("%d ", raiz->chave);
  93. }
  94. else
  95. {
  96. mostrarNivel(raiz->esq, nivelAtual + 1, nivelAlvo);
  97. mostrarNivel(raiz->dir, nivelAtual + 1, nivelAlvo);
  98. }
  99. }
  100.  
  101. void mostrarArvore(No* raiz)
  102. {
  103. int altura = nivelArvore(raiz);
  104.  
  105. for (int i = 1; i <= altura; i++)
  106. {
  107. mostrarNivel(raiz, 1, i);
  108. printf("\n");
  109. }
  110. }
  111. int main()
  112. {
  113. No* raiz = NULL;
  114. int chave;
  115.  
  116.  
  117. do
  118. {
  119. scanf("%d", &chave);
  120. if (chave != -1)
  121. {
  122. raiz = insere_no(chave, raiz);
  123. }
  124. }
  125. while(chave != -1);
  126.  
  127. mostrarArvore(raiz);
  128.  
  129. return 0;
  130. }
  131.  
Success #stdin #stdout 0s 5300KB
stdin
23
45
65
28
33
64
7
34
9
87
90
14
54
38
10
3
25
-1
stdout
23 
7 45 
3 9 28 65 
14 25 33 64 87 
10 34 54 90 
38