Vous êtes sur la page 1sur 1

Module: Aigorithmique Il

Série Exercices N°12: Les Arbres


Dans ce TD, nous allons implémenter des arbres binaires de recherche (ou ABR) et des
fonctions pour les manipuler. Un ABR est tout d'abord" binaire "ce qui implique que chacun
de ses nœuds peut comporter au maximum deux fils. Il est aussi construit de façon à ce qu'il
soit facile de faire une recherche sur les valeurs qu'il contient. Pour cela, on définit les deux
règles suivantes:

Toutes les valeurs inférieures ou égales à celle de la racine sont stockées dans le sous-
arbre gauche.
Toutes les valeurs strictement supérieures à celle de la racine sont stockées dans le
sous arbre droit.
Les sous-arbres gauche et droit de la racine sont aussi des ABR.

1. Définissez une structure struct ABR permettant de coder un noeud d'ABR contenant
un entier (en utilisant notamment des pointeurs).
2. Écrivez une fonction cree_arbre qui prend en argument un entier et renvoie un ABR
d'un seul noeud contenant cette valeur.
3. Écrivez une fonction affiche_croissant permettant d'afficher les valeurs des noeuds
d'un ABR de manière croissante.
'4. Écrivez une fonction affiche_arbre permettant d'afficher les valeurs des nœuds d'un
ABR de manière à voir la structure de l'arbre. Un noeud sera affiché par (g,v,d) où g
est le sous-arbre gauche, v la valeur du noeud et d le sous-arbre droit. Par exemple,
l'arbre présenté dans la figure 1 sera affiché par
«L,1,~,3,~,4,(L,6,~,6,(L,7,~,9,~)).

Les '_' indiquent les sous-arbres vides.

5. Écrivez une fonction ajoute_entier permettant d'ajouter un entier dans l'ABR (ce sera
une nouvelle feuille bien placée dans l'arbre). Si vous êtes coincés: il y a différents
cas à considérer :

L'arbre est vide (pointeur NULL), dans ce cas la fonction de l'exercice 2 peut servir.
L'entier à insérer est plus petit ou égal à la valeur de la racine. Et dans ce cas, la racine
a-t'elle déjà un fils gauche?
L'entier à insérer est plus grand que la valeur de la racine. Et dans ce cas, la racine a-
t'elle déj à un fils droit?

6. Écrivez la fonction trouve_noeud qui prend en argument un entier et un arbre et qui


renvoie l'adresse d'un noeud de l'arbre contenant cet entier (ou l\TlJLL si cet entier
n'est pas dans l'arbre).

7. Écrivez une fonction supprime_feuille permettant de supprimer une feuille de l'arbre


contenant un·certain entier (passé en argument).
8. Écrivez une fonction supprime_noeud1 permettant de supprimer un entier de l'arbre
uniquement s'il est contenu par une feuille ou par un noeud n'ayant qu'un seul fils.