Advertisement
frentzy

preordine

Jan 14th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. // Vizitare in preordine, 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. 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 preorder(int k, FILE* fout) {
  19.   int q, foundNode, j;
  20.  
  21.   q = 0;
  22.   while (q == 0) {       // cat timp nu s-a terminat parcurgerea
  23.    // cat timp se poate coboram spre stanga
  24.     while (stang[k] > 0) {
  25.       visit(k, fout);
  26.       k = stang[k];
  27.     }
  28.  
  29.     visit(k, fout);
  30.  
  31.     // incercam sa determinam un nod k ce poseda un descendent drept,
  32.     // descendent drept ce nu a mai fost vizitat
  33.     while ((q == 0) && (drept[k] == 0)) {
  34.       foundNode = 0;     // ia valoarea 1 atunci cand urcam intr-un nod venind din stanga
  35.       while ((q == 0) && (foundNode == 0)) {
  36.         j = k;
  37.         k = tata[k];
  38.         if (k == 0) {
  39.           q = 1;
  40.         } else {
  41.             if (drept[k] != j) {
  42.               foundNode = 1;
  43.             }
  44.         }
  45.       }
  46.     }
  47.  
  48.     if (q == 0) {       // daca nu s-a terminat vizitarea
  49.       k = drept[k];     // facem un pas spre dreapta
  50.     }
  51.   }
  52. }
  53.  
  54.  
  55. int main() {
  56.   FILE *fin, *fout;
  57.   int n, i, rad;
  58.  
  59.   fin = fopen("preordine.in", "r");
  60.   fout = fopen("preordine.out", "w");
  61.  
  62.   fscanf(fin, "%d", &n);
  63.   for (i = 1; i <= n; i++) {
  64.     fscanf(fin, "%d %d %d", &label[i], &stang[i], &drept[i]);
  65.  
  66.     // pastram tatal fiecarui nod din arbore
  67.     if (stang[i] != 0) {
  68.       tata[stang[i]] = i;
  69.     }
  70.  
  71.     if (drept[i] != 0) {
  72.       tata[drept[i]] = i;
  73.     }
  74.   }
  75.  
  76.   // determinam radacina arborelui
  77.   for (i = 1, rad = 0; (i <= n) && (rad == 0); i++) {
  78.     if (tata[i] == 0) {
  79.       rad = i;
  80.     }
  81.   }
  82.  
  83.   preorder(rad, fout);
  84.        
  85.   fclose(fin);
  86.   fclose(fout);
  87.  
  88.   return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement