Cod sursă (job #582158)

Utilizator avatar Vlad_Anica Anica-Popa Vlad-Ioan Vlad_Anica IP ascuns
Problemă Pointeri Compilator cpp-32 | 1,44 kb
Rundă Arhiva de probleme Status evaluat
Dată 17 feb. 2021 13:02:22 Scor 50

#include <stdio.h>

#define MAX_N 200000
#define NIL -1

int st[MAX_N], dr[MAX_N];

/**
 * Liniarizează subarborele cu rădăcina în node. Returnează, în first și în last,
 * pointeri către primul și ultimul element din lista rezultată.
 **/
void linear(int node, int *first, int *last) {
  int firstC, lastC;

  // Liniarizez subarborele stâng, dacă există, și așez nodul curent la sfârșitul lui
  if (st[node] != NIL) {
    linear(st[node], &firstC, &lastC);
    st[node] = lastC;
    dr[lastC] = node;
    *first = firstC;
  } else {
    *first = node;
  }

  // Liniarizez subarborele drept, dacă există, și așez nodul curent la începutul lui
  if (dr[node] != NIL) {
    linear(dr[node], &firstC, &lastC);
    dr[node] = firstC;
    st[firstC] = node;
    *last = lastC;
  } else {
    *last = node;
  }
}

int main(void) {
  int n, root, first, ignored;

  // Citire
  FILE *f = fopen("pointeri.in", "r");
  fscanf(f, "%d %d\n", &n, &root);
  for (int i = 0; i < n; i++) {
    fscanf(f, "%d", &st[i]);
  }
  for (int i = 0; i < n; i++) {
    fscanf(f, "%d", &dr[i]);
  }
  fclose(f);

  linear(root, &first, &ignored);

  // Scriere
  f = fopen("pointeri.out", "w");
  fprintf(f, "%d\n", first);
  for (int i = 0; i < n; i++) {
    fprintf(f, "%d ", st[i]);
  }
  fprintf(f, "\n");
  for (int i = 0; i < n; i++) {
    fprintf(f, "%d ", dr[i]);
  }
  fprintf(f, "\n");
  fclose(f);
}