Skip to content
Snippets Groups Projects
Verified Commit d2525486 authored by orestis.malaspin's avatar orestis.malaspin
Browse files
parents 8f779496 8b7c84ad
Branches
No related tags found
No related merge requests found
Pipeline #13181 passed
---
title: Arbres de recherche binaires
date: 2021-03-24
---
# Arbres binaires de recherche
Qu'est-ce qu'un *arbre binaire de recherche* ou *binary search tree*?
## Définition
1. Arbre binaire: chaque nœud à **au plus** deux sommets enfants.
2. Chaque nœud contient une clé.
3. Pour chaque nœud, tous les nœud du **sous-arbre gauche** ont une clé
inférieure ou égale au nœud considéré et tous les nœuds du **sous-arbre
droit** du nœud considéré ont une clé supérieure ou égale au nœud considéré.
La propriété 3 est connue sous le nom de propriété ABR (ou BST property).
## Utilité
* Recherche de clé, *min/max*.
* File de priorité.
* Parcours ordonné (parcours infixe) => tri.
# Exemple
## Un arbre binaire de recherche d'entiers
![Exemple d'ABR contenant 9 valeurs. Source:
Wikipedia.](https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Binary_search_tree.svg/1024px-Binary_search_tree.svg.png){width=60%}
# Structure de données
## Fonctionnalités importantes
\footnotesize
1. Insertion de clé
2. Recherche de clé
3. Suppression de clé
## Récursivité
La propriété ABR est **récursive** (les sous-arbres doivent être ABR):
* L'enfant de gauche est plus petit que nœud courant?
* L'enfant de droite est plus petit que nœud courant?
* Le sous-arbre de gauche/droite est-il ABR?
<!-- ```C -->
<!-- bool is_bst(tree) { -->
<!-- if (is_empty(tree)) return true; -->
<!-- // l'enfant de gauche est plus grand => faux -->
<!-- if (!is_empty(tree.left) && tree.left.key > tree.key) return false; -->
<!-- // l'enfant de droite est plus petit => faux -->
<!-- if (!is_empty(tree.right) && tree.right.key < tree.key) return false; -->
<!-- // récursivement si les sous-arbres sont pas des ABR -->
<!-- if (!is_bst(tree.left) || !is_bst(tree.right)) return false; -->
<!-- } -->
<!-- ``` -->
# L'insertion
\footnotesize
Insertion récursive:
```C
tree insert(tree, key) {
// fin de la récursion, on crée le noeud et retourne
si l'arbre est vide:
return create_node(key);
// recherche d'où insérer
si la clé est plus petite que le noeud courant:
si le sous-arbre gauche est vide:
sous-arbre gauche = create_node(key);
sinon:
return insert(sous-arbe gauche, key);
si la clé est plus grande que le noeud courant:
si le sous-arbre droit est vide:
sous-arbre droit = create_node(key);
sinon:
return insert(sous-arbre droit, key);
// on retourne l'arbre!
return tree;
}
```
......@@ -3,7 +3,7 @@ title: Framework de tests
date: 2021-03-17
---
# Tests manuels (2/2)
# Tests manuels (1/2)
## Instructions conditionnelles
......@@ -24,7 +24,7 @@ int main() {
```bash
$ ./tests
Error. Expected 1, Actual -2.
Error. Expected -1, Actual -2.
```
**Erreurs détaillées** mais *long à écrire* et *pas généralisable*.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment