// --- File Arbres.c --- // Time-stamp: // Created on: by mz@labri.fr on [Espelette] #include #include #include typedef struct tree { int value; struct tree *left, *right; } *ptree; #define OOPS(msg) \ do { \ fprintf(stderr, "\t*** %s: Error file %s, line %d, function %s\n ***", \ msg, __FILE__, __LINE__, __func__); \ } \ while(false) ptree make_ptree(int v, ptree l, ptree r) { ptree p = malloc(sizeof(struct tree)); if (!p) { OOPS("Erreur malloc"); exit (EXIT_FAILURE); } p->value = v; p->left = l; p->right = r; return p; } ptree leaf(int v) { return make_ptree(v, NULL, NULL); } void free_ptree(ptree p) { if (!p) { return; } free_ptree(p->left); free_ptree(p->right); free(p); } void postfix(ptree p, void(*f)(int)) { if (!p) { return; } postfix(p->left, f); postfix(p->right, f); f(p->value); } void prefix(ptree p, void(*f)(int)) { if (!p) { return; } f(p->value); prefix(p->left, f); prefix(p->right, f); } void infix(ptree p, void(*f)(int)) { if (!p) { return; } infix(p->left, f); f(p->value); infix(p->right, f); } void print_value(int n) { printf("%d ", n); } int main(void) { ptree p = make_ptree( 1, make_ptree(2, leaf(3), leaf(4)), make_ptree(5, leaf(6), leaf(7)) ); postfix(p, print_value); printf("\n"); infix(p, print_value); printf("\n"); prefix(p, print_value); printf("\n"); free_ptree(p); return EXIT_SUCCESS; } // arbres.c ends here