diff --git a/slides/cours_15.md b/slides/cours_15.md index 684a1cfc97a23d238f36c98a64cddac0d1d727b6..0ea72645e7b207426c08c786924cd50bc33b6d68 100644 --- a/slides/cours_15.md +++ b/slides/cours_15.md @@ -336,10 +336,10 @@ A . . . ```C -<r, A1, A2> - r: racine - A1: sous-arbre gauche - A2: sous-arbre droite +<R, G, D> + R: racine + G: sous-arbre gauche + D: sous-arbre droite ``` ## Comment cela s'écrirait en C? @@ -376,7 +376,7 @@ typedef struct _node { ```C NULL -> arbre (vide) <n, arbre, arbre> -> arbre -racine(arbre) -> noeud +visiter(arbre) -> noeud gauche(arbre) -> arbre (sous-arbre de gauche) droite(arbre) -> arbre (sous-arbre de droite) ``` @@ -422,3 +422,212 @@ graph TD; ::: +# Parcours d'arbres binaires + +* Appliquer une opération à tous les noeuds de l'arbre. +* Nécessité de **parcourir** l'arbre. + +## Une idée de comment parcourir cet arbre? + +* Trois parcours (R: Racine, G: sous-arbre gauche, D: sous-arbre droit): + + +::: columns + +:::: column +```{.mermaid format=pdf width=200 loc=figs/} +graph TD; + A[*]-->B[-]; + B-->C[c]; + B-->D[*]; + D-->E[a]; + D-->F[b]; + A-->G[+]; + G-->H[d]; + G-->I["/"]; + I-->J[e]; + I-->K[f]; +``` +:::: + +:::: column + +1. Pacrours **préfixe** (R, G D), +2. Parcours **infixe** (G, R, D), +3. Parcours **postfixe** (G, D, R). + +:::: + +::: + +# Le parcours infixe (G, R, D) + +* Gauche, Racine, Droite: + 1. On descend dans l'arbre de gauche tant qu'il est pas vide, + 2. On visite la racine du sous arbre, + 3. On descend dans le sous-arbre de droite (s'il est pas vide), + 4. On recommence. + +. . . + +## Incompréhensible? + +* La récursivité c'est la vie. + +``` +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)) +``` + +# Graphiquement (dessinons) + +::: columns + +:::: column +```{.mermaid format=pdf width=200 loc=figs/} +graph TD; + A[*]-->B[-]; + B-->C[c]; + B-->D[*]; + D-->E[a]; + D-->F[b]; + A-->G[+]; + G-->H[d]; + G-->I["/"]; + I-->J[e]; + I-->K[f]; +``` +:::: + +:::: 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)) +``` + +:::: + +::: + + +# Graphiquement (`mermaid` c'est super) + +::: columns + +:::: column +```{.mermaid format=pdf width=200 loc=figs/} +graph TD; + A[*]-->B[-]; + A[*]-.->|1|B[-]; + B-->C[c]; + B-.->|2|C[c]; + C-.->|3|B; + B-->D[*]; + B-.->|4|D; + D-->E[a]; + D-.->|5|E; + E-.->|6|D; + D-->F[b]; + D-.->|7|F; + F-.->|8|A; + A-->G[+]; + A-.->|9|G; + G-->H[d]; + G-.->|10|H; + H-.->|11|G; + G-->I["/"]; + G-.->|12|I; + I-->J[e]; + I-.->|13|J; + J-.->|14|I; + I-->K[f]; + I-.->|15|K; +``` +:::: + +:::: 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)) +``` + +## Remarque + +Le noeud est visité à la **remontée**. + +## Résultat + +``` +a * b - c * d + e / f +``` + +:::: + +::: + +# Et en C? + +## Live code + +. . . + +```C +// Déclarations pour le type arbre +typedef int data; +typedef struct _node { + data info; + struct _node* left; + struct _node* right; +} node; +typedef node* tree_t; +void tree_print(tree_t tree, int n) { + if (NULL != tree) { + tree_print(tree->left, n+1); + for (int i = 0; i < n; i++) { + printf(" "); + } + printf("%d\n", tree->info); + tree_print(tree->gauche, n+1); + } +} +``` + +# Question + +## Avez-vous compris le fonctionnement? + +. . . + +## Vous en êtes sûr·e·s? + +. . . + +## OK, alors deux exercices: + +1. Écrire le pseudo-code pour le parcours R, G, D (matrix). +2. Écrire le pseudo-code pour la parcours G, D, R (matrix), + +## Rappel + +``` +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)) +```