Advertisement
ExIsTeR

Grafuri/Postordine

Jan 13th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. // Vizitare in postordine, varianta recursiva. Arborele este reprezentat prin vectorii stang, drept, tata si label.
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define NMAX 1000
  7.  
  8. int label[NMAX + 1]; // label[k] - eticheta nodului k
  9. int tata[NMAX + 1]; // tata[k] - parintele nodului k, sau 0 daca k este radacina
  10. int stang[NMAX + 1]; // stang[k] - descendentul stang al nodului k, sau 0 daca nu exista
  11. int drept[NMAX + 1]; // drept[k] - descendentul drept al nodului k, sau 0 daca nu exista
  12.  
  13.  
  14. void visit(int node, FILE* f) {
  15. fprintf(f, "%d ", label[node]);
  16. }
  17.  
  18. void postorder(int k, FILE* fout) {
  19. if (k > 0) {
  20. postorder(stang[k], fout);
  21. postorder(drept[k], fout);
  22.  
  23. visit(k, fout);
  24. }
  25. }
  26.  
  27.  
  28. int main() {
  29. FILE *fin, *fout;
  30. int n, i, rad;
  31.  
  32. fin = fopen("postordine.in", "r");
  33. fout = fopen("postordine.out", "w");
  34.  
  35. fscanf(fin, "%d", &n);
  36. for (i = 1; i <= n; i++) {
  37. fscanf(fin, "%d %d %d", &label[i], &stang[i], &drept[i]);
  38.  
  39. // pastram tatal fiecarui nod din arbore
  40. if (stang[i] != 0) {
  41. tata[stang[i]] = i;
  42. }
  43.  
  44. if (drept[i] != 0) {
  45. tata[drept[i]] = i;
  46. }
  47. }
  48.  
  49. // determinam radacina arborelui
  50. for (i = 1, rad = 0; (i <= n) && (rad == 0); i++) {
  51. if (tata[i] == 0) {
  52. rad = i;
  53. }
  54. }
  55.  
  56. postorder(rad, fout);
  57.  
  58. fclose(fin);
  59. fclose(fout);
  60.  
  61. return 0;
  62. }
  63.  
  64. 6
  65. 2 3 5
  66. 6 0 6
  67. 1 0 0
  68. 7 1 2
  69. 4 0 0
  70. 10 0 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement