Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
cours
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
algorithmique
cours
Commits
7ad83607
Commit
7ad83607
authored
3 months ago
by
paul.albuquer
Browse files
Options
Downloads
Patches
Plain Diff
Corrected typos in binary tree part
parent
471f0334
No related branches found
No related tags found
No related merge requests found
Pipeline
#38084
passed
3 months ago
Stage: test
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
slides/cours_15.md
+50
-51
50 additions, 51 deletions
slides/cours_15.md
with
50 additions
and
51 deletions
slides/cours_15.md
+
50
−
51
View file @
7ad83607
...
@@ -227,15 +227,15 @@ void hm_print(hm h);
...
@@ -227,15 +227,15 @@ void hm_print(hm h);
## Plus sérieusement
## Plus sérieusement
*
Ensemble de
**nœuds**
et d'
**arêtes**
(graphe)
,
*
Ensemble de
**nœuds**
et d'
**arêtes**
(graphe)
.
*
Les arêtes relient les nœuds entre eux, mais pas n'importe comment: chaque
*
Les arêtes relient les nœuds entre eux, mais pas n'importe comment: chaque
nœud a au plus un
**parent**
,
nœud a au plus un
**parent**
.
*
Le seul nœud sans parent est la
**racine**
,
*
Le seul nœud sans parent est la
**racine**
.
*
Chaque nœud a un nombre fini d'
**enfants**
,
*
Chaque nœud a un nombre fini d'
**enfants**
.
*
La hiérarchie des nœuds rend les arêtes
**orientées**
(parent -> enfants), et empêche les
*
La hiérarchie des nœuds rend les arêtes
**orientées**
(parent -> enfants), et empêche les
**cycles**
(acyclique, orienté).
**cycles**
(acyclique, orienté).
*
La
**feuille**
ou
**nœud terminal**
est un nœud sans enfants
,
*
La
**feuille**
ou
**nœud terminal**
est un nœud sans enfants
.
*
Le
**niveau**
est 1 à la racine et
**niveau+1**
pour les enfants
,
*
Le
**niveau**
est 1 à la racine et
**niveau+1**
pour les enfants
.
*
Le
**degré**
d'un nœud est le nombre de enfants du nœud.
*
Le
**degré**
d'un nœud est le nombre de enfants du nœud.
. . .
. . .
...
@@ -363,11 +363,11 @@ graph TD;
...
@@ -363,11 +363,11 @@ graph TD;
:::
:::
*
Les nœuds de degré 0
,
sont des feuilles.
*
Les nœuds de degré 0 sont des feuilles.
# Application: recherche rapide
# Application: recherche rapide
## Pouvez
vous construire un arbre pour résoudre le nombre secret?
## Pouvez
-
vous construire un arbre pour résoudre le nombre secret?
. . .
. . .
...
@@ -399,7 +399,7 @@ graph LR;
...
@@ -399,7 +399,7 @@ graph LR;
:::
:::
# Autres représentation
# Autres représentation
s
*
Botanique
*
Botanique
*
**Exercice:**
Ajouter les degrés/niveaux et feuilles
*
**Exercice:**
Ajouter les degrés/niveaux et feuilles
...
@@ -418,7 +418,7 @@ graph TD;
...
@@ -418,7 +418,7 @@ graph TD;
H-->K;
H-->K;
```
```
# Autres représentation
# Autres représentation
s
*
Ensembliste
*
Ensembliste
...
@@ -448,7 +448,7 @@ graph TD;
...
@@ -448,7 +448,7 @@ graph TD;
:::
:::
# Autres représentation
# Autres représentation
s
*
Liste
*
Liste
...
@@ -541,11 +541,11 @@ A
...
@@ -541,11 +541,11 @@ A
# L'arbre binaire
# L'arbre binaire
*
Structure de données abstraite
,
*
Structure de données abstraite
.
*
Chaque nœud a au plus deux enfants: gauche et droite
,
*
Chaque nœud a au plus deux enfants: gauche et droite
.
*
Chaque enfant
s
est un arbre.
*
Chaque enfant est un arbre.
## Comment représenteriez
vous une telle structure?
## Comment représenteriez
-
vous une telle structure?
. . .
. . .
...
@@ -583,7 +583,7 @@ typedef struct _node {
...
@@ -583,7 +583,7 @@ typedef struct _node {
## Interface minimale
## Interface minimale
*
Qu'y mettriez
vous?
*
Qu'y mettriez
-
vous?
. . .
. . .
...
@@ -627,7 +627,7 @@ graph TD;
...
@@ -627,7 +627,7 @@ graph TD;
## Remarques
## Remarques
*
L'arbre est
**hétérogène**
: le genre d'info est pas le même sur chaque nœud
*
L'arbre est
**hétérogène**
: le genre d'info
n'
est pas le même sur chaque nœud
(opérateur, opérande).
(opérateur, opérande).
*
Les feuilles contiennent les opérandes.
*
Les feuilles contiennent les opérandes.
*
Les nœuds internes contiennent les opérateurs.
*
Les nœuds internes contiennent les opérateurs.
...
@@ -638,14 +638,13 @@ graph TD;
...
@@ -638,14 +638,13 @@ graph TD;
# Parcours d'arbres binaires
# Parcours d'arbres binaires
*
Appliquer une opération à tous les nœuds de l'arbre,
*
Appliquer une opération à tous les nœuds de l'arbre:
*
Nécessité de
**parcourir**
l'arbre,
*
Nécessité de
**parcourir**
l'arbre.
*
Utiliser uniquement l'interface: visiter, gauche,
*
Utiliser uniquement l'interface: visiter, gauche, droite
droite.
## Une idée de comment parcourir cet arbre?
## Une idée de comment parcourir cet arbre?
*
3 parcours (R:
R
acine, G: sous-arbre gauche, D: sous-arbre droit):
*
3 parcours (R:
r
acine, G: sous-arbre gauche, D: sous-arbre droit):
::: columns
::: columns
...
@@ -679,16 +678,16 @@ graph TD;
...
@@ -679,16 +678,16 @@ graph TD;
# Le parcours infixe (G, R, D)
# Le parcours infixe (G, R, D)
*
Gauche, Racine, Droite:
*
Gauche, Racine, Droite:
1.
On descend dans l'arbre de gauche tant qu'il est pas vide
,
1.
On descend dans l'arbre de gauche tant qu'il
n'
est pas vide
.
2.
On visite la racine du sous
arbre
,
2.
On visite la racine du sous
-
arbre
.
3.
On descend dans le sous-arbre de droite (s'il est pas vide)
,
3.
On descend dans le sous-arbre de droite (s'il
n'
est pas vide)
.
4.
On recommence.
4.
On recommence.
. . .
. . .
## Incompréhensible?
## Incompréhensible?
*
La récursivité c'est la vie.
*
La récursivité
,
c'est la vie.
```
```
parcours_infixe(arbre a)
parcours_infixe(arbre a)
...
@@ -723,11 +722,11 @@ graph TD;
...
@@ -723,11 +722,11 @@ graph TD;
```
```
parcours_infixe(arbre a)
parcours_infixe(arbre a)
si est_pas_vide(gauche(a))
si est_pas_vide(gauche(a))
parcours_infixe(gauche(a))
parcours_infixe(gauche(a))
visiter(A)
visiter(A)
si est_pas_vide(droite(A))
si est_pas_vide(droite(A))
parcours_infixe(droite(A))
parcours_infixe(droite(A))
```
```
::::
::::
...
@@ -774,11 +773,11 @@ graph TD;
...
@@ -774,11 +773,11 @@ graph TD;
```
```
parcours_infixe(arbre a)
parcours_infixe(arbre a)
si est_pas_vide(gauche(a))
si est_pas_vide(gauche(a))
parcours_infixe(gauche(a))
parcours_infixe(gauche(a))
visiter(A)
visiter(A)
si est_pas_vide(droite(A))
si est_pas_vide(droite(A))
parcours_infixe(droite(A))
parcours_infixe(droite(A))
```
```
## Remarque
## Remarque
...
@@ -843,18 +842,17 @@ void tree_print(tree_t tree, int n) {
...
@@ -843,18 +842,17 @@ void tree_print(tree_t tree, int n) {
```
```
parcours_infixe(arbre a)
parcours_infixe(arbre a)
si est_pas_vide(gauche(a))
si est_pas_vide(gauche(a))
parcours_infixe(gauche(a))
parcours_infixe(gauche(a))
visiter(A)
visiter(A)
si est_pas_vide(droite(A))
si est_pas_vide(droite(A))
parcours_infixe(droite(A))
parcours_infixe(droite(A))
```
```
# Correction
# Correction
\f
ootnotesize
\f
ootnotesize
*
Les deux parcours sont des modifications
**triviales**
[^2] de l'algorithme
*
Les deux parcours sont des modifications
**triviales**
[^2] de l'algorithme infixe.
infixe.
## Le parcours postfixe
## Le parcours postfixe
...
@@ -970,7 +968,7 @@ sous-arbres de gauche et de droite.
...
@@ -970,7 +968,7 @@ sous-arbres de gauche et de droite.
```
python
```
python
arbre
recherche
(
clé
,
arbre
)
arbre
recherche
(
clé
,
arbre
)
tant
e
_que
est_non_vide
(
arbre
)
tant_que
est_non_vide
(
arbre
)
si
clé
<
clé
(
arbre
)
si
clé
<
clé
(
arbre
)
arbre
=
gauche
(
arbre
)
arbre
=
gauche
(
arbre
)
sinon
si
clé
>
clé
(
arbre
)
sinon
si
clé
>
clé
(
arbre
)
...
@@ -997,9 +995,9 @@ typedef node* tree_t;
...
@@ -997,9 +995,9 @@ typedef node* tree_t;
tree_t search(key_t key, tree_t tree) {
tree_t search(key_t key, tree_t tree) {
tree_t current = tree;
tree_t current = tree;
while (NULL != current) {
while (NULL != current) {
if (current->key >
X
) {
if (current->key >
key
) {
current = current->gauche;
current = current->gauche;
} else if (current->key <
X
){
} else if (current->key <
key
){
current = current->droite;
current = current->droite;
} else {
} else {
return current;
return current;
...
@@ -1021,7 +1019,7 @@ qui retourne le nombre total de nœuds d'un arbre et poster le résultat sur
...
@@ -1021,7 +1019,7 @@ qui retourne le nombre total de nœuds d'un arbre et poster le résultat sur
matrix.
matrix.
Indication: la taille, est 1 + le nombre de nœuds du sous-arbre de gauche
Indication: la taille, est 1 + le nombre de nœuds du sous-arbre de gauche
additionné au nombre de nœuds d
ans le
sous-arbre de droite.
additionné au nombre de nœuds d
u
sous-arbre de droite.
. . .
. . .
...
@@ -1031,14 +1029,14 @@ int arbre_size(tree_t tree) {
...
@@ -1031,14 +1029,14 @@ int arbre_size(tree_t tree) {
return 0;
return 0;
} else {
} else {
return 1 + tree_size(tree->left)
return 1 + tree_size(tree->left)
+ tree_size(tree->right);
+ tree_size(tree->right);
}
}
}
}
```
```
# L'insertion dans un arbre binaire
# L'insertion dans un arbre binaire
*
C'est bien joli de pouvoir faire des parcours, recherches, mais si on peut
*
C'est bien joli de pouvoir faire des parcours, recherches, mais si on
ne
peut
pas construire l'arbre....
pas construire l'arbre....
## Pour un arbre lexicographique
## Pour un arbre lexicographique
...
@@ -1051,9 +1049,9 @@ int arbre_size(tree_t tree) {
...
@@ -1051,9 +1049,9 @@ int arbre_size(tree_t tree) {
*
Clés uniques pour simplifier.
*
Clés uniques pour simplifier.
*
Insertion de 5, 15, 10, 25, 2, -5, 12, 14, 11.
*
Insertion de 5, 15, 10, 25, 2, -5, 12, 14, 11.
*
Rappel:
*
Rappel:
*
Plus petit que la clé courante => gauche,
*
Plus petit que la clé courante =>
à
gauche,
*
Plus grand que la clé courante => droite.
*
Plus grand que la clé courante =>
à
droite.
*
Faisons le dessin
s
ensemble
*
Faisons le dessin ensemble
```
```
...
@@ -1128,8 +1126,9 @@ ajout(arbre, clé)
...
@@ -1128,8 +1126,9 @@ ajout(arbre, clé)
tree_t position(tree_t tree, key_t key) {
tree_t position(tree_t tree, key_t key) {
tree_t current = tree;
tree_t current = tree;
if (NULL != current) {
if (NULL != current) {
tree_t subtree = key > current->key ? current->right :
tree_t subtree
current->left;
= key > current->key
? current->right : current->left;
while (key != current->key && NULL != subtree) {
while (key != current->key && NULL != subtree) {
current = subtree;
current = subtree;
subtree = key > current->key ? current->right :
subtree = key > current->key ? current->right :
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment