Vous êtes sur la page 1sur 4

L3 IUP AISEM/ICM

Algorithmique et langage C

J.M. ENJALBERT

Chapitre 4

Arbres binaires
4.1 Introduction

Un arbre est une structure compose de noeuds et de feuilles (noeuds terminaux) relis par des e e branches. On le reprsente gnralement en mettant la racine en haut et les feuilles en bas (contraie e e rement a un arbre rel). ` e

Racine

K M

L Feuilles

Fig. 4.1 Exemple darbre

Le noeud A est la racine de larbre. Les noeuds E, I, J, M, L et H sont des feuilles. Les noeuds B, C, D, F, G et K sont des noeuds intermdiaires. e Si une branche relie un noeud ni a un noeud nj situ plus bas, on dit que ni est un anctre ` e e de nj . Dans un arbre, un noeud na quun seul p`re (anctre direct). e e Un noeud peut contenir une ou plusieurs valeurs. La hauteur (ou profondeur) dun noeud est la longueur du chemin qui le lie a la racine. `

4.2

Arbres binaires

Un arbre binaire est un arbre tel que les noeuds ont au plus deux ls (gauche et droit).

27

L3 IUP AISEM/ICM

Algorithmique et langage C

J.M. ENJALBERT

Fig. 4.2 Exemple darbre binaire

4.3

Arbres binaires de recherche

Un arbre binaire de recherche est un arbre binaire qui poss`de la proprit fondamentale suivante: e ee tous les noeuds du sous-arbre de gauche dun noeud de larbre ont une valeur infrieure ou e gale a la sienne. e ` tous les noeuds du sous-arbre de droite dun noeud de larbre ont une valeur suprieure ou e gale a la sienne. e ` Exemple:
10

13

11

15

Fig. 4.3 Arbre binaire de recherche

4.3.1

Recherche dans larbre

Un arbre binaire de recherche est fait pour faciliter la recherche dinformations. La recherche dun noeud particulier de larbre peut tre dnie simplement de mani`re rcursive: e e e e Soit un sous-arbre de racine ni , e ` e si la valeur recherche est celle de la racine ni , alors la recherche est termine. On a trouv le e noeud recherch. e sinon, si ni est une feuille (pas de ls) alors la recherche est infructueuse et lalgorithme se termine. si la valeur recherche est plus grande que celle de la racine alors on explore le sous-arbre e de droite cest ` dire que lon remplace ni par son noeud ls de droite et que lon relance la a procdure de recherche a partir de cette nouvelle racine. e ` 28

L3 IUP AISEM/ICM

Algorithmique et langage C

J.M. ENJALBERT

de la mme mani`re, si la valeur recherche est plus petite que la valeur de n i , on remplace e e e ni par son noeud ls de gauche avant de relancer la procdure.. e Si larbre est quilibr chaque itration divise par 2 le nombre de noeuds candidats. La complexit e e e e est donc en O(log2 n) si n est le nombre de noeuds de larbre.

4.3.2

Ajout dun lment ee

Pour conserver les proprits dun arbre binaire de recherche ncessite de, lajout dun nouvel ee e lment ne peut pas se faire nimporte comment. ee Lalgorithme rcursif dajout dun lment peut sexprimer ainsi: e ee soit x la valeur de llment a insrer. ee ` e soit v la valeur du noeud racine ni dun sous-arbre. si ni nexiste pas, le crer avec la valeur x. n. e sinon si x est plus grand que v, remplacer ni par son ls droit. recommencer lalgorithme a partir de la nouvelle racine. ` sinon remplacer ni par son ls gauche. recommencer lalgorithme a partir de la nouvelle racine. `
6 9 8
5>4

5<6

3 1 0 4

5>3

12 10

Fig. 4.4 Ajout de 5 dans larbre

4.3.3

Implmentation e

En langage C, un noeud dun arbre binaire peut tre reprsent par une structure contenant un e e e champ donne et deux pointeurs vers les noeuds ls: e struct s_arbre { int valeur; struct s_arbre * gauche; struct s_arbre * droit; }; typedef struct s_arbre t_arbre; La fonction dinsertion qui permet dajouter un lment dans larbre et donc de le crer de ee e mani`re a ce quil respecte les proprits dun arbre binaire de recherche peut scrire ainsi: e ` ee e void insertion(t_arbre ** noeud, int v) 29

L3 IUP AISEM/ICM

Algorithmique et langage C

J.M. ENJALBERT

{ if (*noeud==NULL) /* si le noeud nexiste pas, on le cre */ e { *noeud=(t_arbre*) malloc(sizeof(t_arbre)); (*noeud)->valeur=v; (*noeud)->gauche=NULL; (*noeud)->droit=NULL; } else { if (v>(*noeud)->valeur) insertion(&(*noeud)->droit,v); /* aller a droite */ else insertion(&(*noeud)->gauche,v); /* aller a gauche */ } } On peut noter par ailleurs que larbre qui sera construit dpendra de lordre dans lequel seront e insres les direntes valeurs. En particulier, si les valeurs sont insres dans un ordre croissnt on e e e e e obtiendra un arbre compl`tement dsquilibr, chaque noeud nayant quun ls droit (gauche si les e e e e valeurs sont dans un ordre dcroissant). e

30