From bab8ccf0a8a90ddd9d41c25de3b15856c2671de3 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Sat, 19 Feb 2022 11:48:15 +0100 Subject: [PATCH] ended parcours --- slides/cours_15.md | 113 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 17 deletions(-) diff --git a/slides/cours_15.md b/slides/cours_15.md index f9e3435..ec9df4e 100644 --- a/slides/cours_15.md +++ b/slides/cours_15.md @@ -376,7 +376,7 @@ typedef struct _node { ```C NULL -> arbre (vide) <n, arbre, arbre> -> arbre -visiter(arbre) -> noeud +visiter(arbre) -> noeud (la racine de l'arbre) gauche(arbre) -> arbre (sous-arbre de gauche) droite(arbre) -> arbre (sous-arbre de droite) ``` @@ -424,8 +424,10 @@ graph TD; # Parcours d'arbres binaires -* Appliquer une opération à tous les noeuds de l'arbre. -* Nécessité de **parcourir** l'arbre. +* Appliquer une opération à tous les noeuds de l'arbre, +* Nécessité de **parcourir** l'arbre, +* On utilise uniquement l'interface définie plus haut (visiter, gauche, + droite). ## Une idée de comment parcourir cet arbre? @@ -475,7 +477,7 @@ graph TD; * La récursivité c'est la vie. ``` -parcours_infixe(arbre a) : +parcours_infixe(arbre a) si est_pas_vide(gauche(a)) parcours_infixe(gauche(a)) visiter(A) @@ -506,7 +508,7 @@ graph TD; :::: column ``` -parcours_infixe(arbre a) : +parcours_infixe(arbre a) si est_pas_vide(gauche(a)) parcours_infixe(gauche(a)) visiter(A) @@ -557,12 +559,12 @@ graph TD; :::: column ``` -parcours_infixe(arbre a) : -si est_pas_vide(gauche(a)) - parcours_infixe(gauche(a)) -visiter(A) -si est_pas_vide(droite(A)) - parcours_infixe(droite(A)) +parcours_infixe(arbre a) + si est_pas_vide(gauche(a)) + parcours_infixe(gauche(a)) + visiter(A) + si est_pas_vide(droite(A)) + parcours_infixe(droite(A)) ``` ## Remarque @@ -600,7 +602,7 @@ void tree_print(tree_t tree, int n) { printf(" "); } printf("%d\n", tree->info); - tree_print(tree->gauche, n+1); + tree_print(tree->right, n+1); } } ``` @@ -624,9 +626,86 @@ void tree_print(tree_t tree, int n) { ``` parcours_infixe(arbre a) -si est_pas_vide(gauche(a)) - parcours_infixe(gauche(a)) -visiter(A) -si est_pas_vide(droite(A)) - parcours_infixe(droite(A)) + si est_pas_vide(gauche(a)) + parcours_infixe(gauche(a)) + visiter(A) + si est_pas_vide(droite(A)) + parcours_infixe(droite(A)) ``` + +# Correction + +* Les deux parcours sont des modifications **triviales**[^1] de l'algorithme + infixe. + +## Le parcours postfixe + +```python +parcours_postfoxe(arbre a) + si est_pas_vide(gauche(a)) + parcours_postfixe(gauche(a)) + si est_pas_vide(droite(a)) + parcours_postfixe(droite(a)) + visiter(a) +``` + +## Le parcours préfixe + +```python +parcourx_préfixe(arbre a) + visiter(a) + si est_pas_vide(gauche(a)) + parcours_préfixe(gauche(a)) + si est_pas_vide(droite(a)) + parcours_préfixe(droite(a)) +``` + +. . . + +**Attention:** L'implémentation de ces fonctions en C sont **à faire** en +exercice (inspirez vous de ce qu'on a fait avant)! + +# Exercice: parcours + +## Comment imprimer l'arbre ci-dessous? + +``` + f + / + e + + + d +* + c + - + b + * + a +``` + +. . . + +## Bravo vous avez trouvé! + +* Il s'agissait du parcours D, R, G. + +# Implémentation + +## Vous avez 5 min pour implémenter cette fonction et la poster sur matrix! + +. . . + +```C +void pretty_print(tree_t tree, int n) { + if (NULL != tree) { + pretty_print(tree->right, n+1); + for (int i = 0; i < n; ++i) { + printf(" "); + } + printf("%d\n", tree->info); + pretty_print(tree->left); + } +} +``` + +[^1]: Copyright cours de mathématiques pendant trop d'années. -- GitLab