Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tc_info:2020_td-tp_abr [2020/08/06 19:53] – pprea | tc_info:2020_td-tp_abr [2020/08/09 14:18] (Version actuelle) – pprea | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== TD-TP " | ||
+ | |||
+ | Ce " | ||
+ | |||
+ | Il n'est pas nécessaire de faire tout le TD avant d' | ||
+ | ~~NOTOC~~ | ||
+ | |||
+ | ===== Partie TD ===== | ||
+ | |||
+ | < | ||
+ | Un **Arbre Binaire** est un arbre tel que chaque sommet a au plus deux fils. Les arbres binaires sont très utilisés car ils permettent de modéliser un grand nombre de situations ; de plus, les arbres non binaires sont plus complexes à implémenter (//i.e.// programmer effectivement). | ||
+ | </ | ||
+ | |||
+ | === 1. Caractéristiques d'un arbre binaire === | ||
+ | Donnez des algorithmes (avec leur complexité) qui calculent: | ||
+ | * Le nombre de sommets d'un arbre, | ||
+ | * Le nombre de feuilles d'un arbre, | ||
+ | * La hauteur d'un arbre. | ||
+ | [[tc_info: | ||
+ | |||
+ | < | ||
+ | Un **Arbre (Binaire) de Recherche** est un arbre binaire dont les sommets sont indexés par un ensemble ordonné (//e.g.// des nombres) & tel que, pour chaque sommet s, les descendants gauches de s aient une étiquette plus petite que celle de s & les descendants droits une étiquette plus grande. | ||
+ | </ | ||
+ | |||
+ | === 2. Dessin === | ||
+ | Dessinez un arbre de recherche. \\ [[tc_info: | ||
+ | |||
+ | |||
+ | === 3. Parcours === | ||
+ | Que donnent les trois parcours classiques (En-ordre, Pré-Ordre, Post-Ordre) sur un arbre de recherche ?\\ [[tc_info: | ||
+ | |||
+ | === 4. Fonctions de base === | ||
+ | Donnez des algorithmes (avec leurs complexités) qui : | ||
+ | * Détermine si une valeur x est dans un arbre de recherche | ||
+ | * Insère une valeur x dans un arbre de recherche. [[tc_info: | ||
+ | * Supprime une valeur x d'un arbre de recherche. [[tc_info: | ||
+ | |||
+ | === 5. Création === | ||
+ | Donnez un algorithme qui, à partir d'une liste de nombres, crée un arbre de recherche ([[tc_info: | ||
+ | |||
+ | |||
+ | < | ||
+ | Pour rechercher une valeur dans un tableau //trié//, on utilise généralement la **recherche dichotomique**, | ||
+ | </ | ||
+ | |||
+ | === 6. Recherche dichotomique 1 === | ||
+ | Quel est le lien entre recherche dichotomique & arbres de recherche ? | ||
+ | |||
+ | === 7. Recherche dichotomique 2 === | ||
+ | Écrivez la recherche dichotomique (de préférence de manière itérative). Attention, la recherche dichotomique est un algorithme très simple mais sur lequel on fait beaucoup d' | ||
+ | |||
+ | === 8. Choix 1 === | ||
+ | Il existe deux versions de la recherche dichotomique : soit on arrête l' | ||
+ | |||
+ | === 9. Choix 2 === | ||
+ | Avantages & inconvénients des arbres de recherche par rapport aux tableaux triés ? [[tc_info: | ||
+ | |||
+ | |||
+ | ===== Partie TP ===== | ||
+ | |||
+ | Un arbre binaire est ici défini comme suit : | ||
+ | * un arbre vide correspond à la valeur '' | ||
+ | * La racine d'un arbre non vide est une liste constituée de 3 éléments | ||
+ | * la valeur | ||
+ | * la racine du sous-arbre gauche | ||
+ | * la racine du sous-arbre droit | ||
+ | |||
+ | Un arbre binaire de recherche respecte de plus la contrainte suivante: | ||
+ | * pour tout nœud de l' | ||
+ | * les valeurs situées dans le sous-arbre gauche sont plus petites que la valeur du nœud | ||
+ | * les valeurs situées dans le sous-arbre droit sont plus grandes que la valeur du nœud | ||
+ | |||
+ | Nous implémentons dans ce TP un arbre binaire de recherche. | ||
+ | |||
+ | Ouvrez l' | ||
+ | |||
+ | Dans ce projet, créez un fichier python '' | ||
+ | |||
+ | === 1. Pour commencer === | ||
+ | |||
+ | L' | ||
+ | |||
+ | <code python> | ||
+ | INDEX = 0 | ||
+ | GAUCHE = 1 | ||
+ | DROIT = 2 | ||
+ | </ | ||
+ | |||
+ | * Créez une fonction '' | ||
+ | * Testez cette fonction dans le fichier de test (vérifiez que l' | ||
+ | * Créez une fonction '' | ||
+ | * Testez cette fonction dans le fichier de test (vérifiez que la valeur contenue dans la feuille est correcte, et que les fils gauche et droit sont nuls) | ||
+ | |||
+ | === 2. Insérer des valeurs === | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | algo : insérer_rec | ||
+ | données : | ||
+ | * racine | ||
+ | * val | ||
+ | début: | ||
+ | si racine est nul: | ||
+ | retourner feuille(val) | ||
+ | sinon: | ||
+ | si val < racine[INDEX]: | ||
+ | racine[GAUCHE] <-- insérer_rec(racine[GAUCHE], | ||
+ | sinon: | ||
+ | racine[DROIT] <-- insérer_rec(racine[DROIT], | ||
+ | retourner racine | ||
+ | </ | ||
+ | |||
+ | * Ajoutez la fonction '' | ||
+ | * Testez-la à l'aide du fichier de test, en particulier: | ||
+ | * vérifier que l' | ||
+ | * vérifiez qu' | ||
+ | * affichez l' | ||
+ | |||
+ | === 3. Affichage en ordre === | ||
+ | Écrivez et testez une fonction qui affiche les valeurs de l' | ||
+ | |||
+ | === 4. Recherche === | ||
+ | * Écrivez une fonction de recherche récursive '' | ||
+ | * Testez cette fonction dans le fichier de tests | ||
+ | |||
+ | === 5. Suppression === | ||
+ | * Ecrivez et testez une fonction '' | ||
+ | * Aidez-vous de la fonction '' | ||
+ | * Testez cette fonction dans le fichier de tests | ||
+ | |||
+ | |||
+ | === 6. Affichage en arbre === | ||
+ | |||
+ | Pour bien comprendre l' | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |23-| | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10-| | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |3--| | ||
+ | | ||
+ | | ||
+ | </ | ||