Advertisement
frentzy

inordine

Jan 14th, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. // Vizitare in inordine, varianta iterativa. 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. typedef struct stack {
  9.           int top;
  10.           int a[NMAX];
  11.         } STACK;
  12.  
  13. int label[NMAX + 1];  // label[k] - eticheta nodului k
  14. int tata[NMAX + 1];   // tata[k] - parintele nodului k, sau 0 daca k este radacina
  15. int stang[NMAX + 1];  // stang[k] - descendentul stang al nodului k, sau 0 daca nu exista
  16. int drept[NMAX + 1];  // drept[k] - descendentul drept al nodului k, sau 0 daca nu exista
  17.  
  18.  
  19. void init(STACK* s) {
  20.   s->top = -1;
  21. }
  22.  
  23. int empty(STACK* s) {
  24.   return (s->top == -1);
  25. }
  26.  
  27. void push(STACK* s, int x) {
  28.   s->top++;
  29.   s->a[s->top] = x;
  30. }
  31.  
  32. int peek(STACK* s) {
  33.   return s->a[s->top];
  34. }
  35.  
  36. void pop(STACK* s) {
  37.   s->top--;
  38. }
  39.  
  40. void visit(int node, FILE* f) {
  41.   fprintf(f, "%d ", label[node]);
  42. }
  43.  
  44. void inorder(int k, FILE* fout) {
  45.   int q, j;
  46.   STACK stk;
  47.  
  48.   init(&stk);
  49.   q = 0;
  50.   while (q == 0) {       // cat timp nu s-a terminat parcurgerea
  51.     // cat timp se poate coboram spre stanga
  52.     while (stang[k] > 0) {
  53.       push(&stk, k);     // salvam pe stiva nodurile din care
  54.                          // coboram spre stanga
  55.       k = stang[k];
  56.     }
  57.  
  58.     visit(k, fout);
  59.  
  60.     // incercam sa determinam un nod k ce poseda un descendent drept,
  61.     // descendent drept ce nu a mai fost vizitat
  62.     while ((q == 0) && (drept[k] == 0)) {
  63.       if (empty(&stk)) {
  64.         q = 1;
  65.       } else {
  66.           k = peek(&stk);
  67.           pop(&stk);
  68.           visit(k, fout);
  69.       }
  70.     }
  71.  
  72.     if (q == 0) {       // daca nu s-a terminat vizitarea
  73.       k = drept[k];     // facem un pas spre dreapta
  74.     }
  75.   }
  76. }
  77.  
  78.  
  79. int main() {
  80.   FILE *fin, *fout;
  81.   int n, i, rad;
  82.  
  83.   fin = fopen("inordine.in", "r");
  84.   fout = fopen("inordine.out", "w");
  85.  
  86.   fscanf(fin, "%d", &n);
  87.   for (i = 1; i <= n; i++) {
  88.     fscanf(fin, "%d %d %d", &label[i], &stang[i], &drept[i]);
  89.  
  90.     // pastram tatal fiecarui nod din arbore
  91.     if (stang[i] != 0) {
  92.       tata[stang[i]] = i;
  93.     }
  94.  
  95.     if (drept[i] != 0) {
  96.       tata[drept[i]] = i;
  97.     }
  98.   }
  99.  
  100.   // determinam radacina arborelui
  101.   for (i = 1, rad = 0; (i <= n) && (rad == 0); i++) {
  102.     if (tata[i] == 0) {
  103.       rad = i;
  104.     }
  105.   }
  106.  
  107.   inorder(rad, fout);
  108.        
  109.   fclose(fin);
  110.   fclose(fout);
  111.  
  112.   return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement