Adloun

Les trois parcours, et ce que chacun révèle

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 10 — Arbres

Énoncé

Donner les parcours préfixe, infixe et postfixe de l'arbre de l'exercice précédent. Lequel donne la hauteur ? Lequel donne l'ordre de libération de la mémoire en C ?

Corrigé

Les trois parcours, mesurés :

préfixe
infixe
postfixe

Ce que chaque ligne dit. Le préfixe commence par la racine : c'est le seul des trois dont on lit la racine d'un coup d'œil. Le postfixe la termine. L'infixe la place au milieu — à la cinquième position ici, ce qui signifie que le sous-arbre gauche compte quatre nœuds.

Aucun des trois ne donne la hauteur, et c'est le point de la question. Un parcours produit une liste : il aplatit la structure. Les trois parcours de , de hauteur , et ceux d'un arbre de hauteur à deux nœuds bien choisis, peuvent coïncider. La hauteur se calcule, elle ne se lit pas dans une liste — il faut une fonction récursive qui remonte l'information, ce que hauteur fait avec son max.

Le postfixe est l'ordre de libération. En C, detruire doit libérer les fils avant le père :


/* Libere tout l'arbre. Parcours POSTFIXE : les fils AVANT le pere. */
void detruire(noeud* a) {
    if (a == NULL) { return; }
    detruire(a->gauche);
    detruire(a->droit);
    free(a);                    /* le pere en DERNIER */
}

Libérer le père d'abord serait la faute : après free(a), lire a->gauche est une utilisation après libération, et les deux sous-arbres deviennent inaccessibles — une fuite de mémoire doublée d'un pointeur fou. L'ordre postfixe n'est donc pas ici un choix esthétique : c'est le seul correct, et il découle du fait qu'un fils doit être atteint avant que son père ne disparaisse.

Symétriquement, une copie d'arbre se fait naturellement en préfixe : on crée le nœud, puis on lui accroche des fils déjà construits. Chaque parcours a son emploi, et il est dicté par la dépendance des données, jamais par le goût.

Vérification : la version C, compilée avec -Wall -Wextra, affiche taille = 7, hauteur = 3, feuilles = 3 et infixe = 1 3 4 6 8 7 9, et le contrôleur de fuites rapporte 0 leaks for 0 total leaked bytes.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.