diff --git a/slides/cours_15.md b/slides/cours_15.md index 592ac2e3197480bd20ce1f32fcd217e982857a2d..fe1d4167a691faa57bf26b294301a3787c3b6671 100644 --- a/slides/cours_15.md +++ b/slides/cours_15.md @@ -36,6 +36,12 @@ patat: * Le **niveau** est 1 à la racine et **niveau+1** pour les fils, * Le **degré** d'un noeud est le nombre de fils du noeud. +. . . + +* Chaque noeud est un arbre en lui même. +* La **récursivité** sera très utile! + + # Arbre ou pas arbre? ::: columns @@ -159,18 +165,259 @@ graph TD; # Application: recherche rapide +## Pouvez vous construire un arbre pour résoudre le nombre secret? + + . . . + * Le nombre secret ou la recherche dychotomique (nombre entre 0 et 10). -```{.mermaid format=pdf width=300 loc=figs/} +```{.mermaid format=pdf width=280 loc=figs/} graph LR; - 5-->2; - 5-->7; - 7-->8; - 7-->6; - 8-->9; - 9-->10; - 2-->1; - 2-->3; - 3-->4; - 1-->0; + 5-->|<|2; + 5-->|>|7; + 7-->|>|8; + 7-->|<|6; + 8-->|>|9; + 9-->|>|10; + 2-->|<|1; + 2-->|>|3; + 3-->|>|4; + 1-->|<|0; +``` + +# Autres représentation + +* Botanique +* Ajouter les degrés/niveaux et feuilles + +```{.mermaid width=300 format=pdf loc=figs/} +graph TD; + A-->B; + A-->C; + B-->D; + B-->E; + B-->F; + F-->I; + F-->J; + C-->G; + C-->H; + H-->K; +``` + +# Autres représentation + +* Ensembliste + +::: columns + +:::: column +```{.mermaid width=300 format=pdf loc=figs/} +graph TD; + A-->B; + A-->C; + B-->D; + B-->E; + B-->F; + F-->I; + F-->J; + C-->G; + C-->H; + H-->K; +``` +:::: + +. . . + +:::: column + +:::: + +::: + +# Autres représentation + +* Liste + +::: columns + +:::: column +```{.mermaid width=300 format=pdf loc=figs/} +graph TD; + A-->B; + A-->C; + B-->D; + B-->E; + B-->F; + F-->I; + F-->J; + C-->G; + C-->H; + H-->K; +``` +:::: + +. . . + +:::: column +``` +(A + (B + (D) + (E) + (F + (I) + (J) + ) + ) + (C + (G) + (H + (K) + ) + ) +) +``` +:::: + +::: + +# Autres représentation + +* Par niveau + +::: columns + +:::: column +```{.mermaid width=300 format=pdf loc=figs/} +graph TD; + A-->B; + A-->C; + B-->D; + B-->E; + B-->F; + F-->I; + F-->J; + C-->G; + C-->H; + H-->K; ``` +:::: + +. . . + +:::: column +``` +1 2 3 4 +------------------------- +A + B + D + E + F + I + J + C + G + H + K +``` +:::: + +::: + +# L'arbre binaire + +* Structure de données abstraite, +* Chaque noeud a au plus deux fils: gauche et droite, +* Chaque fils est un arbre. + +## Comment représenteriez vous une telle structure? + +. . . + +```C +<r, A1, A2> + r: racine + A1: sous-arbre gauche + A2: sous-arbre droite +``` + +## Comment cela s'écrirait en C? + +. . . + +```C +typedef struct _node { + contenu info; + struct _node *left_subtree, *right_subtree; +} node; +typedef node *tree; +``` + +# L'arbre binaire + +## Que se passerait-il avec + +```C +typedef struct _node { + int info; + struct _node left_subtree, right_subtree; +} node; +``` + +* On ne sait pas quelle est la taille de node, on ne peut pas l'allouer! + +## Interface minimale + +* Qu'y mettriez vous? + +. . . + +```C +NULL -> arbre (vide) +<n, arbre, arbre> -> arbre +racine(arbre) -> noeud +gauche(arbre) -> arbre (sous-arbre de gauche) +droite(arbre) -> arbre (sous-arbre de droite) +``` + +* Les autres opérations (insertion, parcours, etc) dépendent de ce qu'on stocke + dans l'arbre. + +# Exemple d'arbre binaire + +* Représentez `(a * b - c) * (d + e / f)` à l'aide d'un arbre binaire (matrix) + +. . . + +::: 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 + +## Remarques + +* L'arbre est **hétérogène**: le genre d'info est pas le même sur chaque noeud. + * Les feuilles contiennent les opérandes. + * Les noeuds internes contiennent les opérateurs. + +:::: + +::: +