struct_cours6

48
Type abstrait Implantation Arbres modifiables Extensions Conception de structures de donn´ ees Cours 6 Arbres binaires 22 avril 2013 Struct 1/30

description

effsffd

Transcript of struct_cours6

Page 1: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Conception de structures de donnees

Cours 6

Arbres binaires

22 avril 2013

Struct 1/30

Page 2: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Pourquoi les arbres ?

Struct 2/30

Page 3: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Pourquoi les arbres ?

Structure de donnees omnipresente en Informatique :

structure naturelle : arbre de decision, tournoi, genealogie,arborescence des repertoires, expressions arithmetiques, ...

en algorithmique du texte (Huffamn, prefix-trees) :compression, recherche de motifs, detection de repetitions, ...

en geometrie algorithmique (quadtrees, octrees, KD-trees,arbres rouge-noir, ...) ;

en linguistique et en compilation (arbres syntaxiques) ;

pour la gestion du cache, les bases de donnees, les systemesde fichiers, ... (B-trees,).

Struct 2/30

Page 4: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Definition des arbres BINAIRES

Un arbre binaire est une structure permettant de stockerune collection de donnees de meme type.

Definition recursive : un arbre binaire est :

soit vide,soit un noeud contenant une donnee et ayant 2 fils (gauche etdroit) qui sont eux-memes des arbres binaires.

L’espace memoire utilise par un arbre n’est pas contigu.

La taille d’un arbre est inconnue a priori ;

Un arbre binaire est constitue de noeuds qui sont lies entreeux par des pointeurs. On ne peut acceder directement qu’au1er element (la racine) de l’arbre.

Pour acceder a un element quelconque d’un arbre , il fautdescendre dans l’arbre jusqu’a cet element.

! ! ! Un arbre n’est PAS une structure LINEAIRE ! ! !

Struct 3/30

Page 5: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Representation graphique d’un arbre binaire

3

1 8

1 29 170

2 48

Struct 4/30

Page 6: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Arbres binaires recursifs

Struct 5/30

Page 7: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Type abstrait : BTree

typedef ... BTree;

BTree makeEmptyBTree(void); // renvoie un arbre vide

int isEmptyBTree(BTree bt); // teste si l’arbre est vide

BTree makeNode(Element e, Btree l, Btree r);

// renvoie un arbre de racine e ayant l et r pour fils gauche et droit

Element root(BTree bt); // renvoie l’element a la racine de l’arbre

BTree leftChild(BTree bt); // renvoie le fils gauche de l’arbre

BTree rightChild(BTree bt); // renvoie le fils droit de l’arbre

BTree makeLeaf(Element e); // renvoie une feuille contenant l’element e

int isLeaf(BTree bt); // teste si bt est une feuille

void freeNode(Btree bt); // libere l’espace occupe par la racine de bt

Struct 6/30

Page 8: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Ecrire une fonction recursive sur les arbres.

Fonction recursive fonctionRec sur une arbre (bt) :

Cas de base :

isEmptyBTree(bt) /* arbre vide */

isLeaf(bt) /* arbre reduit a une feuille */

Cas general (recursif) : resoudre le probleme sur des arbres pluspetits (les sous-arbres gauche et droit) et combiner les solutions.

fonctionRec(leftChild(bt))

fonctionRec(rightChild(bt))

/* combiner les deux (eventuellement avec la racine)*/

Struct 7/30

Page 9: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Exemples

Calculer la taille (nombre de noeuds) de l’arbre ;

Liberer l’espace memoire occupe par l’arbre ;

Afficher l’arbre ;

Renvoyer la liste des feuilles de l’arbre ;

Calculer la hauteur, la somme des elements, la longueur decheminement, le nombre de Strahler ...

Compter le nombre de noeuds (ou de feuilles) a hauteur k,

Tester l’egalite, l’isomorphisme, l’inclusion de 2 arbres, ...

Fabriquer une copie ou le miroir d’un arbre, ...

Chercher un element quelconque, le min (ou max), lepremier ancetre commun de 2 noeuds, ...

Struct 8/30

Page 10: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Les fonctions size et freeBTree

int size(BTree bt){

if(isEmptyBTree(bt))

return 0;

else return 1+size(leftChild(bt))+size(rightChild(bt));

}

void freeBTreeRec(BTree bt){ /* fonction recursive */

if(!isEmptyBTree(bt)){

BTree l=leftChild(bt); /* liens vers les fils */

BTree r=rightChild(bt);

freeNode(bt); /* liberer le noeud */

freeBTreeRec(l); /* liberer les fils recursivement */

freeBTreeRec(r);

}

}

/* fonction non recursive */

void freeBTree(BTree *bt){ freeBTreeRec(*bt); *bt= NULL;}

Struct 9/30

Page 11: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

La fonction printBTree

void shift(int n){

int i;

for(i = 0;i < n;i++)

printf("\t");

}

void printBTree(BTree bt, int level){

if ( !isEmptyBTree(bt) ) {

printBTree( rightChild(bt), level+1 );

shift(level);

printf("%d\n", root(bt));

printBTree( leftChild(bt), level+1 );

}

}

Struct 10/30

Page 12: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

La fonction listOfLeaves

/* concatenation de 2 listes */

Rlist append(Rlist l1, Rlist l2){ ... }

Rlist listOfLeaves(BTree bt){

if( isEmptyBTree(bt) )

return newEmptyRlist();

else

if( isLeaf(bt) )

return cons( root(bt) , newEmptyRlist() );

else{

Rlist ll=listOfLeaves( leftChild(bt) );

Rlist lr=listOfLeaves( rightChild(bt) );

} return append( ll , lr );

}

Struct 11/30

Page 13: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcourir un arbre en profondeur

La structure d’arbre n’impose pas un ordre total sur leselements, or on voudrait avoir un ordre sur ces elements.Pour cela, on fixe une methode de parcours de l’arbre qui trieles elements par orde de visite.

11

87

101 5

0 6 2

9

3

4

Struct 12/30

Page 14: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcourir un arbre en profondeur

La structure d’arbre n’impose pas un ordre total sur leselements, or on voudrait avoir un ordre sur ces elements.Pour cela, on fixe une methode de parcours de l’arbre qui trieles elements par orde de visite.

11

87

101 5

0 6 2

9

3

4

Struct 12/30

Page 15: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4

Struct 13/30

Page 16: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4

Struct 13/30

Page 17: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11

Struct 13/30

Page 18: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7

Struct 13/30

Page 19: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1

Struct 13/30

Page 20: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0

Struct 13/30

Page 21: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3

Struct 13/30

Page 22: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4

Struct 13/30

Page 23: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5

Struct 13/30

Page 24: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6

Struct 13/30

Page 25: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6 8

Struct 13/30

Page 26: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6 8 9

Struct 13/30

Page 27: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6 8 9 10

Struct 13/30

Page 28: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6 8 9 10 2

Struct 13/30

Page 29: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours prefixe (la racine en 1er)

11

87

101 5

0 6 2

9

3

4 11 7 1 0 3 4 5 6 8 9 10 2

Struct 13/30

Page 30: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours infixe (la racine au milieu)

11

87

101 5

0 6 2

9

3

4

Struct 14/30

Page 31: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours infixe (la racine au milieu)

11

87

101 5

0 6 2

9

3

4 0 1 3 4 7 6 5 11 9 8 10 2

Struct 14/30

Page 32: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours postfixe (la racine en dernier)

11

87

101 5

0 6 2

9

3

4

Struct 15/30

Page 33: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Parcours postfixe (la racine en dernier)

0 4 3 1 6 5 7 9 2 10 8 11

11

87

101 5

0 6 2

9

3

4

Struct 15/30

Page 34: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Les 3 fonctions de parcours

void printPrefixOrder(BTree bt){

if(!isEmptyBTree(bt)){

printf("%d ",root(bt));

printPrefixOrder(leftChild(bt));

printPrefixOrder(rightChild(bt));

}

}

void printInfixOrder(BTree bt){

if(!isEmptyBTree(bt)){

printInfixOrder(leftChild(bt));

printf("%d ",root(bt));

printInfixOrder(rightChild(bt));

}

}

void printPostfixOrder(BTree bt){ ... }

Et une version iterative ? Et le parcours en largeur ?

Struct 16/30

Page 35: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Arbres binaires en C

Struct 17/30

Page 36: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Definition d’un arbre binaire en C

arbre vide:

3

1 8

1 29 170

2 48

arbre contenant 8 éléments

Struct 18/30

Page 37: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Definition d’un arbre binaire en C (suite)

typedef int Element;

typedef struct node{

Element elem;

struct node *left;

struct node *right;

}Node;

typedef Node *BTree;

BTree makeEmptyBTree(void){

return (BTree)NULL;

}

int isEmptyBTree(BTree bt){

return (bt==NULL);

}

Struct 19/30

Page 38: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Definition d’un arbre binaire en C (suite)

BTree makeNode(Element e, BTree l, BTree r){

BTree new;

if ((new=(BTree)malloc(sizeof(Node)))==NULL)

erreur("Allocation ratee!");

new->elem=e;

new->left=l;

new->right=r;

return new;

}

BTree makeLeaf(Element e){return makeNode(e,makeEmptyBTree(),makeEmptyBTree());

}

Element root(BTree bt){

if(isEmptyBTree(bt))

erreur("Pas de noeud a la racine!");

return bt->elem;

}

Struct 20/30

Page 39: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Definition d’un arbre binaire en C (suite)

BTree leftChild(BTree bt){

if(isEmptyBTree(bt)) erreur("Pas de fils gauche!");

return bt->left;

}

BTree rightChild(BTree bt){

if(isEmptyBTree(bt)) erreur("Pas de fils droit!");

return bt->right;

}

int isLeaf(BTree bt){return !isEmptyBTree(bt) &&

isEmptyBTree(leftChild(bt)) &&

isEmptyBTree(rightChild(bt));

}

void freeNode(Node *c){

free(c);

}

Struct 21/30

Page 40: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Arbres binaires modifiables

Struct 22/30

Page 41: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Quelques fonctions de modification

Fonctions “bas niveau” pour inserer ou supprimer des elementsdans un arbre :

void insertRight(Node *n, Element e);

void insertLeft(Node *n, Element e);

Element deleteRight(Node *n);

Element deleteLeft(Node *n);

void insertRightmostNode(BTree *bt, Element e);

void insertLeftmostNode(BTree *bt, Element e);

Element deleteRightmostNode(BTree *bt);

Element deleteLeftmostNode(BTree *bt);

Attention : ces fonctions modifient les arbres ;elles ne fabriquent pas des copies !

Struct 23/30

Page 42: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Quelques fonctions de modification

void insertRight(Node *n, Element e){

if(!isEmptyBTree(n) && isEmptyBTree(rightChild(n)))

n->right=makeLeaf(e);

else erreur("insertRight impossible!");

}

void insertLeft(Node *n, Element e){

if(!isEmptyBTree(n) && isEmptyBTree(leftChild(n)))

n->left=makeLeaf(e);

else erreur("insertLeft impossible!");

}

Element deleteRight(Node *n){

if(isEmptyBTree(n) || !isLeaf(rightChild(n)))

erreur("deleteRight imossible!");

Element res=root(n->right);

n->right=makeEmptyBTree();

return res;

}

Struct 24/30

Page 43: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Quelques fonctions de modification

Element deleteLeft(Node *n){

if(isEmptyBTree(n) || !isLeaf(leftChild(n)))

erreur("deleteLeft imossible!");

Element res=root(n->left);

n->left=makeEmptyBTree();

return res;

}

void insertRightmostNode(BTree *bt, Element e){

if(isEmptyBTree(*bt))

*bt=makeLeaf(e);

else{

BTree tmp=*bt;

while(!isEmptyBTree(rightChild(tmp)))

tmp=rightChild(tmp);

insertRight(tmp,e);

}

}

Struct 25/30

Page 44: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Quelques fonctions de modification

Element deleteLeftmostNode(BTree *bt){

Element res;

if(isEmptyBTree(*bt))

erreur("deleteLeftmostNode imossible!");

if(isEmptyBTree(leftChild(*bt))){

res=root(*bt);

*bt=rightChild(*bt);

}

else{

BTree tmp=*bt;

while(!isEmptyBTree(leftChild(leftChild(tmp))))

tmp=leftChild(tmp);

res=root(leftChild(tmp));

tmp->left=(tmp->left)->right;

}

return res;

}

Struct 26/30

Page 45: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Extensions

Struct 27/30

Page 46: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Extensions

Problemes avec les arbres binaires (a n noeuds) :

Chercher un element coute cher : O(n) ;

Inserer un element (pas n’importe ou !) : O(n) ;

Supprimer un element : on ne peut pas toujours...

Solution ? Ordonner (trier) les elements dans l’arbre...

Un arbre binaire de recherche (BST) est :

soit vide,

soit un noeud :

contenant une donnee (la racine),dont le fils gauche est un BST dontles elements sont inferieurs a la racine,dont le fils droit est un BST dontles elements sont superieurs a la racine.

8

105

111 7

0 6

3

9

2

4

Struct 28/30

Page 47: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Extensions (suite)

Arbre binaire equilibre (AVL) : les hauteurs des deux sous-arbres d’un meme noeud different au plus de 1.

8

105

111 7

0 6

3

9

2

4

BST (pas AVL)

7

94

101 6

0 5 11

8

2

3

AVL

Difficulte : conserver l’equilibrage. Gain : meilleure complexite !

Struct 29/30

Page 48: struct_cours6

Type abstrait Implantation Arbres modifiables Extensions

Extensions - fin

Un arbre general (chaque noeud a une liste de fils :)

8

63

1113 1

0 1814

10

5

4

7

1512

169

2

Struct 30/30