Parcours d un arbre Arbres de recherche CHAPITRE 6. Arbres binaires. Karelle JULLIAN. MPSI, Option Info 2014/2015. Karelle JULLIAN



Documents pareils
Les arbres binaires de recherche

Les structures de données. Rajae El Ouazzani

Recherche dans un tableau

Quelques Algorithmes simples

chapitre 4 Nombres de Catalan

Définitions. Numéro à préciser. (Durée : )

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Arbres binaires de recherche

Image d un intervalle par une fonction continue

La fonction exponentielle

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours

ARBRES BINAIRES DE RECHERCHE

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Limites finies en un point

INF601 : Algorithme et Structure de données

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Chapitre 7. Récurrences

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Fonctions de plusieurs variables

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Université Paris-Dauphine DUMI2E 1ère année, Applications

1 Recherche en table par balayage

Intégration et probabilités TD1 Espaces mesurés Corrigé

I. Polynômes de Tchebychev

Relation d ordre. Manipulation des relations d ordre. Lycée Pierre de Fermat 2012/2013 Feuille d exercices

Résolution d équations non linéaires

Initiation à la Programmation en Logique avec SISCtus Prolog

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Les indices à surplus constant

MIS 102 Initiation à l Informatique

Chapitre 3. Quelques fonctions usuelles. 1 Fonctions logarithme et exponentielle. 1.1 La fonction logarithme

Le produit semi-direct

Continuité en un point

Chapitre 2. Eléments pour comprendre un énoncé

Probabilités sur un univers fini

Introduction à l étude des Corps Finis

Suites numériques 3. 1 Convergence et limite d une suite

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Probabilités sur un univers fini

Chapitre 5 : Flot maximal dans un graphe

DOCM Solutions officielles = n 2 10.

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Date : Tangram en carré page

Baccalauréat ES/L Métropole La Réunion 13 septembre 2013 Corrigé

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs

Construction d un cercle tangent à deux cercles donnés.

Chaînes de Markov au lycée

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Fibonacci et les paquerettes

Résolution de systèmes linéaires par des méthodes directes

I. Ensemble de définition d'une fonction

Nombres, mesures et incertitudes en sciences physiques et chimiques. Groupe des Sciences physiques et chimiques de l IGEN

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

Licence Sciences et Technologies Examen janvier 2010

Chapitre 2 Le problème de l unicité des solutions

Fondements de l informatique Logique, modèles, et calculs

Calculabilité Cours 3 : Problèmes non-calculables.

Correction du Baccalauréat S Amérique du Nord mai 2007

SOCLE COMMUN - La Compétence 3 Les principaux éléments de mathématiques et la culture scientifique et technologique

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Continuité et dérivabilité d une fonction

Rappels sur les suites - Algorithme

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Algorithmique et Programmation

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Introduction à la théorie des graphes. Solutions des exercices

Chapitre 1 : Évolution COURS

Initiation à l algorithmique

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

EXERCICE 4 (7 points ) (Commun à tous les candidats)

Représentation des Nombres

III- Raisonnement par récurrence

Items étudiés dans le CHAPITRE N5. 7 et 9 p 129 D14 Déterminer par le calcul l'antécédent d'un nombre par une fonction linéaire

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

I - PUISSANCE D UN POINT PAR RAPPORT A UN CERCLE CERCLES ORTHOGONAUX POLES ET POLAIRES

Pour l épreuve d algèbre, les calculatrices sont interdites.

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Réalisabilité et extraction de programmes

Calcul fonctionnel holomorphe dans les algèbres de Banach

Taux d évolution moyen.

Chapitre 1 I:\ Soyez courageux!

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Algorithmes récursifs

Algorithmique, Structures de données et langage C

Exercices de dénombrement

Développement décimal d un réel

Problèmes de Mathématiques Filtres et ultrafiltres

Cours de Probabilités et de Statistique

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

Algorithme. Table des matières

Probabilités et Statistiques. Feuille 2 : variables aléatoires discrètes

Représentation d un entier en base b

Raisonnement par récurrence Suites numériques

Exercices sur le chapitre «Probabilités»

Comparaison de fonctions Développements limités. Chapitre 10

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Transcription:

CHAPITRE 6 Arbres binaires Lycée Kléber MPSI, Option Info 2014/2015

1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3 Recherche Complexité Insertion d un élément Suppression d un élément

1 Définitions 2 3

1 Définitions 2 3

Définition Soient deux ensembles de valeurs F (valeurs des feuilles) et N (valeurs des nœuds). Un arbre binaire sur ces ensembles est défini récursivement par : Toute feuille, élément de F, est un arbre. Si n est une valeur de nœud (n N), et g et d deux arbres, (n, g, d) est un nouvel arbre, de racine n, de fils gauche g, de fils droit d.

La définition que nous avons donnée ici permet de distinguer le type des informations portées respectivement par les nœuds et les feuilles d un arbre. On peut décrire un arbre avec f pour une simple feuille, ou encore avec (n1, (n2, f 21, f 22), (n3, f 31, (n4, f 41, f 42))), mais la représentation graphique qu on trouvera dans la figure suivante est sans doute plus claire.

n 1 n 2 n 3 f 21 f 22 f 31 n 4 f 41 f 42 Les feuilles sont dessinées à l aide de carrés, les nœuds par des cercles. On parle aussi de nœuds externes pour les feuilles et de nœuds internes pour les nœuds.

La racine de l arbre précédent est le nœud n 1, qui a deux fils, les arbres de racines n 2 et n 3. Le sous-arbre gauche de racine n 2 a pour fils gauche et droit deux feuilles, tandis que le sous-arbre droit de racine n 3 a respectivement pour fils gauche et droit une feuille et un nouveau sous-arbre de racine n 4, etc... On pourra par abus de langage citer un nœud, en pensant à l arbre ou au sous-arbre dont il est racine. Ainsi n 2 désignera-t-il tout aussi bien le nœud précis qui porte ce nom que tout le sous-arbre qui l admet pour racine.

La racine de l arbre précédent est le nœud n 1, qui a deux fils, les arbres de racines n 2 et n 3. Le sous-arbre gauche de racine n 2 a pour fils gauche et droit deux feuilles, tandis que le sous-arbre droit de racine n 3 a respectivement pour fils gauche et droit une feuille et un nouveau sous-arbre de racine n 4, etc... On pourra par abus de langage citer un nœud, en pensant à l arbre ou au sous-arbre dont il est racine. Ainsi n 2 désignera-t-il tout aussi bien le nœud précis qui porte ce nom que tout le sous-arbre qui l admet pour racine.

La racine de l arbre précédent est le nœud n 1, qui a deux fils, les arbres de racines n 2 et n 3. Le sous-arbre gauche de racine n 2 a pour fils gauche et droit deux feuilles, tandis que le sous-arbre droit de racine n 3 a respectivement pour fils gauche et droit une feuille et un nouveau sous-arbre de racine n 4, etc... On pourra par abus de langage citer un nœud, en pensant à l arbre ou au sous-arbre dont il est racine. Ainsi n 2 désignera-t-il tout aussi bien le nœud précis qui porte ce nom que tout le sous-arbre qui l admet pour racine.

1 Définitions 2 3

En Caml, on définit un type à deux paramètres qui sont les types respectifs des feuilles et des nœuds, à l aide de l instruction suivante : Défintion du type arbre binaire type ( f, n) arbre_binaire = Feuille of f Noeud of n * ( f, n) arbre_binaire * ( f, n) arbre_binaire ;; f et n sont des variables de type, Feuille et Noeud sont des constructeurs de type, le second étant binaire.

Un exemple d arbre binaire du type (int,string) arbre_binaire est : Noeud(1,Feuille a, Noeud(6,Noeud(4,Feuille c, Feuille d ) Feuille b ))

Exercice Définir alors les deux arbres f et (n1, (n2, f 21, f 22), (n3, f 31, (n4, f 41, f 42))) en caml.

Exercice Définir alors les deux arbres f et (n1, (n2, f 21, f 22), (n3, f 31, (n4, f 41, f 42))) en caml. let f = Feuille("f")and a = Noeud("n1", Noeud("n2",Feuille("f21"),Feuille("f22")), Noeud("n3",Feuille("f31"),Noeud("n4",Feuille("f41"), Feuille("f42")))) ;;

1 Définitions 2 3

Définition d un mot binaire Un mot binaire est ou bien le mot vide, noté ɛ, ou bien le résultat de la concaténation d un mot binaire et d un 0 ou d un 1. A tout mot binaire est donc naturellement associé un entier naturel, dont le mot choisi est une écriture en base 2. Par exemple, le mot binaire 10010 est associé à l entier 18. Par convention, le mot vide ɛ sera associé à.

On peut alors numéroter les éléments d un arbre en leur associant un mot binaire. Indexation des éléments On considère un arbre binaire. S il s agit d une feuille, on l indexe par le mot vide ɛ. Si en revanche il s agit d un nœud (n, g, d), on commence par indexer sa racine n par le mot vide, et par effectuer l indexation de tous les éléments de l arbre g et de l arbre d. On ajoute devant l index de chaque élément de l arbre g (resp. d) un 0 (resp. un 1).

Exercice Donner l indexation des éléments dans les deux arbres précédents

n 1 ɛ n 2 0 n 3 1 f 21 00 f 22 01 f 31 10 n 4 11 f 41 110 f 42 111

Exercice 1 Montrer que, dans l indexation précédente, si f 1 et f 2 sont deux feuilles distinctes d un même arbre et m 1, m 2 les mots binaires associés, on a m 1 m 2. 2 Peut-on avoir deux feuilles distinctes de mots m 1 et m 2 associés qui représenteraient le même entier en base 2?

Exercice 1 Montrer que, dans l indexation précédente, si f 1 et f 2 sont deux feuilles distinctes d un même arbre et m 1, m 2 les mots binaires associés, on a m 1 m 2. 2 Peut-on avoir deux feuilles distinctes de mots m 1 et m 2 associés qui représenteraient le même entier en base 2?

Correction 1 Pour un arbre réduit à une feuille, le résultat est clair. Soit a = (n, g, d) un arbre et soient f 1 et f 2 deux feuilles de cet arbre. Ou bien f 1 et f 2 sont des feuilles du même sous-arbre g de a. Dans ce cas leurs index m 1 et m 2 sont obtenus à partir des index m 1 et m 2 qu elles portent dans l arbre g grâce aux relations m 1 = 0m 1 et m 2 = 0m 2. Comme par hypothèse de récurrence m 1 m 2, on a bien m 1 m 2. Ou bien f 1 et f 2 sont des feuilles du même sous-arbre d de a. Dans ce cas on obtient de même m 1 = 1m 1 et m 2 = 1m 2, et on conclut de la même façon. Ou bien f 1 est une feuille de g et f 2 une feuille de d. Mais alors m 1 commence par un 0 et m 2 par un 1, et donc m 1 m 2. 2 oui on peut imaginer un arbre avec une feuille d index 010 et l autre d index 10. C est une notation un peu ambiguë. Voir la figure ci-après.

Correction 1 Pour un arbre réduit à une feuille, le résultat est clair. Soit a = (n, g, d) un arbre et soient f 1 et f 2 deux feuilles de cet arbre. Ou bien f 1 et f 2 sont des feuilles du même sous-arbre g de a. Dans ce cas leurs index m 1 et m 2 sont obtenus à partir des index m 1 et m 2 qu elles portent dans l arbre g grâce aux relations m 1 = 0m 1 et m 2 = 0m 2. Comme par hypothèse de récurrence m 1 m 2, on a bien m 1 m 2. Ou bien f 1 et f 2 sont des feuilles du même sous-arbre d de a. Dans ce cas on obtient de même m 1 = 1m 1 et m 2 = 1m 2, et on conclut de la même façon. Ou bien f 1 est une feuille de g et f 2 une feuille de d. Mais alors m 1 commence par un 0 et m 2 par un 1, et donc m 1 m 2. 2 oui on peut imaginer un arbre avec une feuille d index 010 et l autre d index 10. C est une notation un peu ambiguë. Voir la figure ci-après.

n 1 ɛ n 2 0 n 3 1 f 21 00 n 4 01 f 31 10 f 32 11 f 41 010 f 42 011 Dans cet exemple, les feuilles f 41 et f 31 ont pour index respectifs 010 et 10 qui sont bien différents, certes, mais qui représentent le même nombre en écriture binaire, à savoir 2.

1 Définitions 2 3

Définition : profondeur d un nœud, d un arbre. On appelle profondeur d un nœud ou d une feuille d un arbre le nombre d arêtes qu il faut traverser pour descendre de la racine de l arbre au nœud ou la feuille visé(e). C est donc aussi la longueur du mot binaire qui l indexe dans l indexation décrite précédemment. La profondeur de l arbre est définie comme étant le maximum des profondeurs de ses éléments, ou encore, puisque les feuilles sont sous les nœuds, comme le maximum des profondeurs de ses feuilles.

Implémentation Ecrire un programme Caml qui prend en argument un arbre et renvoie sa profondeur.

Implémentation Ecrire un programme Caml qui prend en argument un arbre et renvoie sa profondeur. let rec profondeur = function Feuille(_) -> 0 Noeud(_,g,d) -> 1+ max (profondeur g) (profondeur d);;

Définition : taille d un arbre. La notion de taille n est pas uniformisée. On compte parfois les nœuds et les feuilles, ou bien seulement les nœuds, ou bien seulement les feuilles. Nous retiendrons la définition suivante : la taille d un arbre binaire est le nombre de ses nœuds. On la notera a si a désigne l arbre binaire.

Implémentation Ecrire deux programmes récursifs en Caml qui prennent chacun en argument un arbre et renvoient respectivement son nombre de feuilles et son nombre de nœuds.

Implémentation Ecrire deux programmes récursifs en Caml qui prennent chacun en argument un arbre et renvoient respectivement son nombre de feuilles et son nombre de nœuds. let rec nb_feuilles = function Feuille(_) -> 1 Noeud(_,g,d) -> (nb_feuilles g) + (nb_feuilles d);; let rec nb_noeuds = function Feuille(_) -> 0 Noeud(_,g,d) -> 1+ (nb_noeuds g) + (nb_noeuds d);;

1 Définitions 2 3

Définition : squelette binaire. Un squelette d arbre binaire est défini récursivement comme étant : soit le mot vide ; Si g et d sont deux squelettes, alors (g, d) est encore un squelette, de fils gauche g et de fils droit d.

On peut commencer par effacer toute l information portée par les nœuds et les feuilles. On obtient ainsi un arbre dessiné à l aide de cercles et de carrés. Si on supprime purement et simplement les feuilles, on obtient un squelette où seuls figurent les nœuds.

Dans la première étape, on a simplement effacé de l information, mais la seconde étape, elle, est irréversible, puisqu on peut, en retour, ajouter des feuilles à tous les endroits possibles.

Exemple Représentez le squelette ((, ), (, (, ))). Le mot ((,, )) est-il un squelette? en Caml type squelette = Vide Jointure of squelette * squelette ;

Exemple Représentez le squelette ((, ), (, (, ))). C est le squelette précédent Le mot ((,, )) est-il un squelette? en Caml type squelette = Vide Jointure of squelette * squelette ;

Exemple Représentez le squelette ((, ), (, (, ))). C est le squelette précédent Le mot ((,, )) est-il un squelette? Non en Caml type squelette = Vide Jointure of squelette * squelette ;

1 Définitions 2 3

Théorème Le nombre de feuilles d un arbre binaire de taille n est égal à n + 1. Un arbre et son squelette ont même taille.

Théorème Le nombre de feuilles d un arbre binaire de taille n est égal à n + 1. Un arbre et son squelette ont même taille. Preuve Soit respectivement n, p, n le nombre de nœuds de l arbre, son nombre de feuilles, et le nombre de nœuds de son squelette. Oublions l information portée par les nœuds et les feuilles. Par définition même d un arbre binaire, tout nœud de l arbre a exactement 2 fils qui sont soit une feuille soit un nouveau nœud. Inversement, toute feuille et tout nœud sauf la racine admet un nœud-père. Ainsi 2n est le nombre de nœuds et feuilles qui ne sont pas à la racine de l arbre, ou encore 2n = n + p 1, ce qui fournit l égalité souhaitée.

On se rappelle que la profondeur d un arbre est la profondeur maximale de ses nœuds et feuilles. Proposition Si k est la profondeur d un arbre binaire, son squelette est de profondeur k 1.

Un arbre binaire peut être très profond et il est plus intéressant de minorer sa profondeur, à une taille fixée. Dessinez deux squelettes de même taille et de profondeurs respectives minimale et maximale.

Deux squelettes de même taille, à gauche de profondeur maximale, à droite de profondeur minimale. Définitions

Théorème Soit s un squelette binaire non vide, de taille n et de profondeur k. Alors log n k n 1, où le log désigne le logarithme en base 2.

Preuve par induction structurelle : Soit s = (g, d) un squelette de taille n, de profondeur k. On notera n g et k g (resp. n d et k d ) la taille et la profondeur de g (resp. de d). Si g et d sont vides, n = 1 et k = 0 : l encadrement est correct. Si g est vide, mais pas d, n = 1 + n d et k = 1 + k d. L hypothèse de récurrence fournit : log(n d ) k d n d 1 D où k n d = n 1. La majoration est bien prouvée. Par ailleurs puisque n d 1, on a 1+ log n d = 1+log n d = log(2n d ) log(n d +1) = log n, ce qui fournit l encadrement souhaité.

Si d est vide, mais pas g, le raisonnement est analogue. Si ni d ni g ne sont vides, on a n = 1 + n d + n g et k = 1 + max(k d, k g ). Par hypothèse de récurrence : k 1 + max(n d 1, n g 1) 1 + max(n 2; n 2) = n 1. Pour la minoration, on a déjà k d log n d et k g log n g. Or l égalité n = 1 + n d + n g montre que n d ou n g est plus grand que n 1 2. Et d après l hypothèse de récurrence, max(k d ; k g ) log n 1 1, donc k log n 2 2. Dans le cas où n est pair, n = 2p + 2, cela donne k 1 + log(p + 1) = log(2(p + 1)) = log n.

Dans le cas où n est impair, n = 2p + 1, cela donne k 1 + log p = log(2p) = log(2p + 1) = log n. Cette dernière égalité provient de l encadrement : log(2p + 1) log(2p) Si on pose k = log p, on a 2 k p 2 k+1 1, d où 2p + 1 2 k+2 1 < 2 k+2. Ainsi log(2p + 1) < k + 2, et log(2p + 1) k + 1 = log(2p), ce qui conclut.

Théorème Soit a un arbre binaire non vide, de taille n et de profondeur k. Alors 1 + log n k n, où le log désigne le logarithme en base 2.

Définition : arbre complet On appelle arbre complet un arbre de profondeur k et de taille n = 2 k 1. Caractérisation Un arbre binaire est complet si et seulement si toutes ses feuilles sont à la même profondeur.

Preuve : Définitions Soit a un arbre complet, de taille n = 2 k 1 et de profondeur k. On sait qu il y a au moins une feuille à la profondeur k. Supposons qu une autre feuille soit à une profondeur strictement plus petite que k. On pourrait la remplacer par un nœud d où pendraient deux feuilles, de profondeur au plus égale à k. L arbre ainsi étendu serait de taille n + 1 (on ajoute un seul nœud, on retranche une feuille et en ajoute deux nouvelles), et toujours de profondeur k. Mais on a vu que k 1 + log(n + 1) = 1 + k, ce qui fournit la contradiction souhaitée. Montrons maintenant la réciproque : il suffit pour cela de compter le nombre de nœuds d un arbre dont toutes les feuilles sont de profondeur k. Ceci ne pose pas de problème particulier, il suffit de remarquer que chaque nœud interne a deux fils, et on trouve effectivement 2 k 1 = 1 + 2 + 2 2 +... + 2 k 1 nœuds.

Un squelette d arbre complet.

Définition : arbre équilibré Un arbre est dit équilibré quand ses feuilles se répartissent sur au plus deux niveaux seulement. L équilibrage d un arbre est le critère essentiel d efficacité des algorithmes de recherche à l aide de structures d arbres.

Caractérisation des arbres équilibrés Un arbre binaire a de taille n et de profondeur k est équilibré si l une ou l autre des conditions équivalentes suivantes est vérifiée : 1 toute feuille de a est de profondeur k ou k 1 ; 2 l arbre obtenu à partir de a en supprimant toutes ses feuilles de profondeur k (i.e en remplaçant les nœuds-pères par des feuilles) est complet. Un arbre équilibré vérifie la condition k = 1 + logn.

Preuve : L équivalence entre (1) et (2) est claire. Montrons qu on a bien, pour un arbre équilibré a, la relation k = 1 + log n. Soit pour cela a l arbre complet obtenu par suppression dans a des feuilles de profondeur k. La taille de a est n, il possède n + 1 feuilles, et donc 1 n n n + 1. La profondeur de a est k 1, donc n = 2 k 1 1. Alors 1 n (2 k 1 1) 2 k 1, soit 2 k 1 n 2 k 1. On a bien log n = k 1.

Pour établir une formule permettant de compter les squelettes de taille n par récurrence, on s appuie sur le fait qu un tel squelette est constitué d une racine et de deux sous-arbres dont la somme des tailles vaut n - 1, l un de taille i, l autre de taille n i 1, ce qui conduit à la relation : n 1 S n = S i S n 1 i i=0 où S k désigne le nombre de squelettes de taille k. On convient que S 0 = 1.

Exercice Ecrire une fonction Caml récursive, prenant en argument l entier n et renvoyant la valeur de S n.

Exercice Ecrire une fonction Caml récursive, prenant en argument l entier n et renvoyant la valeur de S n. let rec S = function 0 -> 1 n -> let sum = ref 0 in for i= 0 to n-1 do sum :=!sum + S(i)*S(n-1-i) done;!sum;;

Voici quelques valeurs de S n : n 0 1 2 3 4 5 6 7 8 9 10 S n 1 1 2 5 14 42 132 429 1430 4862 16796 Mais il y a une formule plus simple pour S n (on parle aussi de closed form ou de formule close) : on peut démontrer que S n = 1 ( 2n 2n + 1 n ). C est le n-ième nombre de Catalan. Soit par récurrence, soit en utilisant le formalisme des séries génératrices.

Posons S(x) = n 0 S n x n. sans se soucier de problèmes de convergence. D après la relation de récurrence vérifiée par S n, on a xs 2 (x) = x 2 S n x n = x ( n ) S k x k S n k x n k n 0 n 0 k=0 = x ( n ) S k S n k x n n 0 k=0 soit xs 2 (x) = x S n+1 x n = S n+1 x n+1 = S(x) 1. n 0 n 0

équation qui a pour seule solution continue en 0 la fonction S(x) = 1 1 4x. 2x Si l on admet la formule (1 x) α = + n=0 n α(α 1)...(α n + 1) ( 1) n! valable pour x < 1 et α réel, on obtient avec a 0 = 1 et pour n 1, a n = ( 4)n n 1 ( 1 n! 2 k k=0 + 1 4x = a n x n n=0 ) = 2n n 1 n! k=0 x n (2k 1) = 2n n 1 n! k=0 (2n 2)! 2 n 1 (n 1)!

soit On en déduit que S(x) = + n=1 a n = 2 n ( 1 2n 2 n n 1 ( 2n 2 n 1 ). ) + ( x n 1 1 2n = n + 1 n n=0 ) x n ce qui donne le résultat si on admet que l on peut identifier les coefficients.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Parcourir un arbre consiste à visiter successivement tous ses nœuds et ses feuilles, en effectuant éventuellement au passage un travail (compter les nœuds, modifier les étiquettes, chercher un nœud d une étiquette donnée...). On distingue deux types de parcours : parcours en largeur, parcours en profondeur.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Un exemple d arbre qui nous servira pour tous les parcours : a b c 1 2 3 d e 6 4 5

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Définition Dans ce parcours, on visite la racine, puis ses fils (i.e les nœuds et feuilles de profondeur 1), puis les nœuds et feuilles de profondeur 2, et ainsi de suite, en convenant en général de visiter les nœuds et feuilles de gauche à droite. On parle aussi de parcours en ordre militaire.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation On définit le type qui correspond à la description de notre arbre :une liste d éléments qui seront ou des feuilles ou des nœuds. type ( f, n) listing_d arbre = F of f N of n ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation Puis le programme proprement dit de parcours : let parcours_militaire a = let rec parcours_rec noeuds_pendants = fun [] -> [] Feuille(f) :: reste -> (F f) :: (parcours_rec reste) noeud(n,g,d) :: reste -> (N n) :: (parcours_rec (reste @ [ g ; d ])) in parcours_rec [a] ;; En revanche, il est difficile de reconstruire l arbre à partir de ce parcours.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Définition Dans ce parcours, on visite d abord le sous-arbre gauche entièrement avant de visiter le sous-arbre droit. On parle aussi de parcours en profondeur d abord ou depth first.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation let rec visite = fun Feuille(f) -> () Noeud(_,g,d) -> visite g ; visite d;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Lors d un parcours en profondeur, un nœud est visité trois fois (sauf la racine) : une première fois quand on arrive sur lui depuis son père, une deuxième fois lorsqu on a fini de parcourir le sous-arbre gauche, une troisième fois lorsqu on s apprête à visiter le sous-arbre droit. Dans la fonction de visite en profondeur écrite précédemment, on peut noter que l on n effectue aucun travail intéressant. Si l on décide d enrichir ce programme, on peut appliquer un traitement à chaque nœud lors de la première rencontre : on parle de traitement préfixe ; lors de la deuxième rencontre : on parle de traitement infixe ; lors de la troisième rencontre : on parle de traitement postfixe.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Lors d un parcours en profondeur, un nœud est visité trois fois (sauf la racine) : une première fois quand on arrive sur lui depuis son père, une deuxième fois lorsqu on a fini de parcourir le sous-arbre gauche, une troisième fois lorsqu on s apprête à visiter le sous-arbre droit. Dans la fonction de visite en profondeur écrite précédemment, on peut noter que l on n effectue aucun travail intéressant. Si l on décide d enrichir ce programme, on peut appliquer un traitement à chaque nœud lors de la première rencontre : on parle de traitement préfixe ; lors de la deuxième rencontre : on parle de traitement infixe ; lors de la troisième rencontre : on parle de traitement postfixe.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Lors d un parcours en profondeur, un nœud est visité trois fois (sauf la racine) : une première fois quand on arrive sur lui depuis son père, une deuxième fois lorsqu on a fini de parcourir le sous-arbre gauche, une troisième fois lorsqu on s apprête à visiter le sous-arbre droit. Dans la fonction de visite en profondeur écrite précédemment, on peut noter que l on n effectue aucun travail intéressant. Si l on décide d enrichir ce programme, on peut appliquer un traitement à chaque nœud lors de la première rencontre : on parle de traitement préfixe ; lors de la deuxième rencontre : on parle de traitement infixe ; lors de la troisième rencontre : on parle de traitement postfixe.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Lors d un parcours en profondeur, un nœud est visité trois fois (sauf la racine) : une première fois quand on arrive sur lui depuis son père, une deuxième fois lorsqu on a fini de parcourir le sous-arbre gauche, une troisième fois lorsqu on s apprête à visiter le sous-arbre droit. Dans la fonction de visite en profondeur écrite précédemment, on peut noter que l on n effectue aucun travail intéressant. Si l on décide d enrichir ce programme, on peut appliquer un traitement à chaque nœud lors de la première rencontre : on parle de traitement préfixe ; lors de la deuxième rencontre : on parle de traitement infixe ; lors de la troisième rencontre : on parle de traitement postfixe.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation On peut se dire que dans le parcours préfixe d un nœud (n, g, d), on commence par lister n, puis on parcourt le sous-arbre g et enfin le sous-arbre d. let rec parcours_prefixe = function Feuille(f) -> [F f] Noeud(n,g,d) -> [N n] @ (parcours_prefixe g) @ (parcours_prefixe d) ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation On peut se dire que dans le parcours infixe d un nœud (n, g, d), on commence par parcourir le sous-arbre gauche, puis on liste n, et on termine par le sous-arbre d. let rec parcours_infixe = function Feuille(f) -> [F f] Noeud(n,g,d) -> (parcours_infixe g) @ [N n] @ (parcours_infixe d) ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Programmation On peut se dire que dans le parcours postfixe (ou suffixe) d un nœud (n, g, d), on commence par parcourir les deux sous-arbres g et d et on termine en listant n. let rec parcours_suffixe = function Feuille(f) -> [F f] Noeud(n,g,d) -> (parcours_suffixe g) @ (parcours_suffixe d) @ [N n] ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Exemple Pour l arbre [N a ; N b ; N c ; F 1; F 2; F 3; N d ; N e ; F 6; F 4; F 5] obtenu par parcours en largeur, qu obtient-on dans les différents parcours en profondeur?

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Exemple 1 Pour le parcours préfixe : 2 Pour le parcours infixe : 3 Pour le parcours postfixe :

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Exemple 1 Pour le parcours préfixe : [ N a ; N b ; F 1; F 2; N c ; F 3; N d ; N e ; F 4; F 5; F 6] 2 Pour le parcours infixe : 3 Pour le parcours postfixe :

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Exemple 1 Pour le parcours préfixe : [ N a ; N b ; F 1; F 2; N c ; F 3; N d ; N e ; F 4; F 5; F 6] 2 Pour le parcours infixe : [ F 1; N b ; F 2; N a ; F 3; N c ; F 4; N e ; F 5; N d ; F 6] 3 Pour le parcours postfixe :

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Exemple 1 Pour le parcours préfixe : [ N a ; N b ; F 1; F 2; N c ; F 3; N d ; N e ; F 4; F 5; F 6] 2 Pour le parcours infixe : [ F 1; N b ; F 2; N a ; F 3; N c ; F 4; N e ; F 5; N d ; F 6] 3 Pour le parcours postfixe : [ F 1; F 2; N b ; F 3; F 4; F 5; N e ; F 6; N d ; N c ; N a ]

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 1 Définitions 2 Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution 3

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Reconstitution à partir de la description préfixe let recompose_prefixe l = let rec recompose = function (F f) :: reste -> Feuille(f), reste (N n) :: reste -> let g, reste = recompose reste in let d, reste = recompose reste in Noeud(n,g,d),reste [] -> failwith "Description prefixe incorrecte" in match recompose l with a,[] -> a _ -> failwith "Description prefixe incorrecte" ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Reconstitution à partir de la description postfixe Attention, il ne suffit pas d appliquer ce qui précède à l image miroir de la liste. let recompose_suffixe l = let rec recompose ss_arbres liste = match ss_arbres,liste with a,(f f) :: reste -> recompose (Feuille(f) :: a) reste d :: g :: a,(n n) :: reste -> recompose (Noeud(n,g,d) :: a) reste [ arbre ],[] -> arbre _ -> failwith "Description suffixe incorrecte" in recompose [] l ;;

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Pour la reconstitution d un arbre binaire à partir de sa description en ordre infixe, c est impossible car la description est ambiguë. En effet, on peut trouver deux arbres difféérents ayant le même parcours infixe/ Exercice : donner un arbre ayant le même parcours infixe que celui donné précédemment 1b2a3c4e5d6.

Parcours en largeur Parcours en profondeur Parcours préfixe, infixe, postfixe Reconstitution Un exemple d arbre ayant pour parcours infixe 1b2a3c4e5d6. c a d b 3 e 6 1 2 4 5

Recherche Complexité Insertion d un élément Suppression d un élément 1 Définitions 2 3 Recherche Complexité Insertion d un élément Suppression d un élément

Recherche Complexité Insertion d un élément Suppression d un élément Cette notion est officiellement au programme de deuxième année. Définition Soit un ensemble ordonné (F, ) de feuilles et une application φ : F N strictement croissante. Un arbre de recherche pour F est un arbre binaire sur les ensembles de feuilles et de nœuds qui est ou bien une feuille ou bien un arbre (n, g, d) tel que pour toute feuille f du sous-arbre gauche g on a φ(f ) < n et pour toute feuille f du sous-arbre droit d on a n < φ(f ). On peut démontrer par induction structurelle que les feuilles d un arbre sont listées dans l ordre croissant dans chacun des parcours infixe, préfixe, suffixe. Le plus souvent on aura F = N avec et φ = id, et tous nos exemples seront construits sur ce modèle.

Recherche Complexité Insertion d un élément Suppression d un élément Voici un exemple d arbre de recherche :

Recherche Complexité Insertion d un élément Suppression d un élément 1 Définitions 2 3 Recherche Complexité Insertion d un élément Suppression d un élément

Recherche Complexité Insertion d un élément Suppression d un élément Comme leur nom l indique, les arbres binaires de recherche servent à la recherche d un élément d une famille : plus précisément, on se donne un ensemble de valeurs et on veut écrire une fonction d appartenance à cet ensemble. Pour ce faire, on pourrait utiliser une liste simple des éléments de l ensemble considéré, et faire une recherche dans cette liste, ce qui donne un algorithme en O(n), où n est la taille de l ensemble de valeurs-cibles.

Recherche Complexité Insertion d un élément Suppression d un élément Exercice Ecrire le programme de recherche décrit précédemment :

Recherche Complexité Insertion d un élément Suppression d un élément Exercice Ecrire le programme de recherche décrit précédemment : let rec recherche l x = match l with [] -> failwith "élément absent de la liste" t :: q -> t = x recherche q x ;;

Recherche Complexité Insertion d un élément Suppression d un élément Principe Les arbres binaires de recherche conduisent à une solution très simple du même probleme, pourvu que l on sache construire un arbre dont l ensemble des feuilles est l ensemble de nos valeurs-cibles. La recherche d un nœud d étiquette x donnée dans un arbre binaire de recherche va consister à descendre dans l arbre, en comparant x à l étiquette y de chaque nœud rencontré. Si y = x c est fini, si y x, on continue dans le sous-arbre gauche, si y x, on continue dans le sous-arbre droit. Si on arrive sur une feuille, c est que l on a échoué.

Recherche Complexité Insertion d un élément Suppression d un élément Lorsque l on a un arbre de recherche sur N cela donne : let rec recherche arbre x = match arbre with Feuille(f) -> x = f failwith "élément absent" Noeud(n,g,d) -> if x > n then recherche d x else recherche g x ;;

Recherche Complexité Insertion d un élément Suppression d un élément Compléter le programme suivant, dans le cas général : let rec recherche phi arbre x = match arbre with Feuille(f) -> x = f failwith "element absent" ;;

Recherche Complexité Insertion d un élément Suppression d un élément Compléter le programme suivant, dans le cas général : let rec recherche phi arbre x = match arbre with Feuille(f) -> x = f failwith "element absent" Noeud(n,g,d) -> if phi x > n then recherche phi d x else recherche phi g x ;;

Recherche Complexité Insertion d un élément Suppression d un élément 1 Définitions 2 3 Recherche Complexité Insertion d un élément Suppression d un élément

Recherche Complexité Insertion d un élément Suppression d un élément Théorème : coût de la recherche La recherche dans un arbre binaire de recherche se réalise en un nombre de comparaisons au plus égal à k + 1, où k est la profondeur de l arbre. Théorème La recherche d un élément dans un ensemble de n valeurs organisées en arbre binaire de recherche se réalise dans le cas le pire en un nombre c(n) de comparaisons qui vérifie : 2 + log(n 1) c(n) n.

Recherche Complexité Insertion d un élément Suppression d un élément Théorème (suite) Dans le cas particulier où l arbre de recherche utilisé est équilibré, on a l égalité c(n) = 2 + log(n 1), ce qui garantit un coût logarithmique pour notre recherche. Toute la difficulté est donc de construire un arbre équilibré de recherche.

Recherche Complexité Insertion d un élément Suppression d un élément 1 Définitions 2 3 Recherche Complexité Insertion d un élément Suppression d un élément

Recherche Complexité Insertion d un élément Suppression d un élément En pratique on veut maintenir une structure dynamique de l ensemble des valeurs-cibles. C est-à-dire qu on veut pouvoir ajouter ou retrancher une valeur à cet ensemble. Il s agit donc pour nous d ajouter ou retrancher une feuille à un arbre binaire de recherche.

Recherche Complexité Insertion d un élément Suppression d un élément Principe Pour insérer un nouvel élément x dans un arbre binaire de recherche, on procède comme pour la recherche : si l on tombe sur un nœud portant cette étiquette, on ne fait rien (on pourrait tout de même ajouter l élément, mais c est un choix). Sinon on descend dans l arbre jusqu à arriver à une feuille ; ou bien c est un élément y différent de x, ce qui signifie que x n est pas encore dans l arbre : on remplace alors la feuille y par un arbre (φ(x), x, y) si φ(x) < φ(y) ou (φ(y), y;, x) sinon.

Recherche Complexité Insertion d un élément Suppression d un élément Programmation Compléter le programme : let rec ajout phi arbre x = match arbre with Feuille(y) -> if x = y then else if phi x < phi y then else Noeud(n,g,d) -> if phi x > n then else ;; La fonction écrite renvoie le nouvel arbre et a une complexité en O(k) où k est la profondeur de l arbre.

Recherche Complexité Insertion d un élément Suppression d un élément Programmation Compléter le programme : let rec ajout phi arbre x = match arbre with Feuille(y) -> if x = y then Feuille(y) else if phi x < phi y then Noeud(phi x,feuille(x),feuille( else Noeud(phi y,feuille(y),feuille(x)) Noeud(n,g,d) -> if phi x > n then Noeud(n,g,ajout phi d x) else Noeud(n,ajout phi g x,d) ;; La fonction écrite renvoie le nouvel arbre et a une complexité en O(k) où k est la profondeur de l arbre.

Recherche Complexité Insertion d un élément Suppression d un élément 1 Définitions 2 3 Recherche Complexité Insertion d un élément Suppression d un élément

Recherche Complexité Insertion d un élément Suppression d un élément Pour la suppression d un élément (on suppose qu il figure bien dans l arbre), il suffit a priori de rechercher l élément considéré, et de couper la feuille correspondante de l arbre. Puis on remplace le nœud-père par le frère gauche ou droit qui subsiste.

Recherche Complexité Insertion d un élément Suppression d un élément deux exemples : 5 3 9 1 5 7 12 1 3 7 8 8 9

Recherche Complexité Insertion d un élément Suppression d un élément 5 3 9 1 5 8 12 1 3 8 9 Pour supprimer l élément 7, on remplace le père de la feuille 7 par son fils droit, et on obtient bien un arbre de recherche qui répond au problème qu on s était posé. Supprimons maintenant de ce nouvel arbre l élément 5.

Recherche Complexité Insertion d un élément Suppression d un élément 5 1 9 1 3 8 12 8 9 Pour supprimer l élément 5, on remplace son père par son frère gauche, et on obtient l arbre ci-dessus.

Recherche Complexité Insertion d un élément Suppression d un élément Programmation Compléter le programme suivant : let rec suppression phi arbre x = match arbre with Feuille(y) -> if x = y then failwith "Arbre vide" else Noeud(n,g,d)-> if phi x > n then if d = Feuille(x) then else if g = Feuille(x) then ;;

Recherche Complexité Insertion d un élément Suppression d un élément Programmation Compléter le programme suivant : let rec suppression phi arbre x = match arbre with Feuille(y) -> if x = y then failwith "Arbre vide" else Feuille(y) Noeud(n,g,d)-> if phi x > n then if d = Feuille(x) then g else Noeud(n,g,suppression phi d x) else if g = Feuille(x) then d else Noeud(n,suppression phi g x,d) ;;