Pagini recente »
2018-02-01-clasa-5-tema-24
|
Istoria paginii utilizator/10irina
|
Istoria paginii utilizator/angel27
|
Monitorul de evaluare
|
Cod sursă (job #582158)
Cod sursă (job
#582158)
#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);
}