• Aucun résultat trouvé

compl´eter la proc´edure procedure verifavl(a:avl)

N/A
N/A
Protected

Academic year: 2022

Partager "compl´eter la proc´edure procedure verifavl(a:avl)"

Copied!
3
0
0

Texte intégral

(1)

TD 5 AVL

Question 1 : Dans un programme contenant les d´eclarations : type element=real; (* ou =integer; ou =string[17] *)

avl=^noeud;

noeud=record

fg,fd:avl;

eq:-1..1;

cle:element end;

compl´eter la proc´edure procedure verifavl(a:avl);

var x:avl;

function hauteur(a:avl):integer;

begin (* hauteur *) ...

end; (* hauteur *) begin (* verifavl *)

x:=nil;

if hauteur(a)=0 then end; (* verifavl *)

La fonction hauteur(a) rend la hauteur de l’arbre dont la racine est a. Elle calcule d’abord r´ecursivement la hauteur du fils gauche puis celle du fils droit et elle en d´eduit la hauteur de l’arbre complet. De plus entre le calcul des hauteurs des deux fils, elle copie a dans x, et juste avant cela elle v´erifie que la cl´e de a est bien strictement plus grande que celle de x (sauf bien sˆur six vaut nil). Au moment du calcul de la hauteur, on peut aussi v´erifier que eq est ´egal `a la diff´erence entre la hauteur du fils droit et celle du fils gauche et qu’il est compris entre −1 et 1.

Question 2 : Compl´eter les proc´edures ayant les entˆetes suivants : procedure tourne(var a:avl);

procedure reequilibre(var a:avl);

function ajoute(var a:avl;x:element):boolean;

function enleve(var a:avl;x:element):boolean;

tourne(A)transforme l’arbre

A

a B

b c

en

B

A c

a b

si A^.eq=1

1

(2)

et

A

B c

a b

en

B

a A

b c

si A^.eq=-1, o`u a, b et c repr´e-

sentent des AVL et B un fils de A. Dans les noeuds A et B, seuls les champs fg et fd sont modifi´es. L’argument de tourne est modifi´e : la nouvelle racine de l’arbre est B.

reequilibre(A) s’applique `a un AVL l´eg`erement d´es´equilibr´e car le facteur d’´equilibrage de la racine vaut ±2. Il y a dix r´e´equilibrages possibles :

h+ 2 A h−1

2

h+ 1

a B

h

0

h

b c

h+ 2 B h+ 1

−1

h

A c

h−1 1

h

a b

h+ 2 A h−1

2

h+ 1

a B

h−1 1

h

b c

h+ 1 B h

0

h

A c

h−1 0

h−1

a b

h+ 3 A h

2

h+ 2

a B

h+ 1

−1

h

C d

h ou h−1

h ou h−1

b c

h+ 2 C h+ 1

0

h+ 1

A B

h

0,−1 h ou h−1

h ou h−1

0,1

h

a b c d

La derni`ere r`egle compte pour trois, selon les trois valeurs possibles de C^.eq. Les cinq autres r`egles correspondent `a A^.eq=-2. Dessinez les. En fait en entr´ee A^.eq ne

2

(3)

peut pas valoir ±2. Donc on supposera que 1 repr´esente 2 et que −1 repr´esente −2.

Le r´e´equilibrage peut toujours ˆetre r´ealis´e par un appel `a tourne(A) ou deux appels tourne(A^.fd);tourne(A) suivis d’une mise `a jour des champs eq. On peut noter que la hauteur globale peut ˆetre inchang´ee ou diminu´ee d’un, mais qu’elle diminue si et seulement si le facteur d’´equilibrage de la racine du nouvel AVL est z´ero.

ajoute(a,x) ins`ere un nouveau noeud de cl´e x dans l’arbre a. Cette expression est vraie si la hauteur de l’arbre augmente d’un, et fausse si la hauteur est inchang´ee. Cette information est utilis´ee apr`es un appel r´ecursif si on a ins´er´e x dans un des fils de a, pour savoir comment mettre `a jour a^.eq (et si on doit appeler reequilibre).

enleve(a,x) retire le noeud de cl´e x de l’AVL a et rend vrai si la hauteur de l’arbre diminue d’un. Si x est la cl´e de a on peut distinguer plusieurs cas selon le nombre de ses fils. Si a^.fd=nil, on peut remplacer a par son fils gauche. On traite de mˆeme le cas o`u a^.fg=nil. Mais sia a deux fils, alors il faut copier la plus petite cl´e du sous-arbre droit de a dans a^.cle puis l’enlever du sous-arbre droit. Pour trouver le noeud contenant la plus petite cl´e du sous-arbre droit de a, on peut faire b:=a^.fd;while b^.fg<>nil do b:=b^.fg.

Question 3 : Dessiner la suite des AVL obtenus en partant d’un AVL initialement vide et en y ins´erant dans cet ordre les ´el´ements 1, 12, 10, 7, 3, 2, 8, 9, 11, 4, 5 et 6. Continuer en enlevant successivement dans cet ordre les ´el´ements 8, 3, 1, 4, 11 et 12. Pour chacun des ajouts et chacune des suppressions, indiquer le nombre de rotations doubles et de rotations simples effectu´ees.

Question 4 : Mˆeme question en ins´erant dans cet ordre dans un AVL initialement vide les ´el´ements 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 et 15.

Question 5: Ecrire une version it´erative d’ajouteet d’enleve. On utilisera comme pile un tableau de pointeurs dans lequel on mettra tous les noeuds appartenant `a la branche de l’AVL allant de la racine jusqu’au noeud ajout´e ou enlev´e.

Question6: Lors de l’insertion d’un noeud dans un AVL, soiente1,e2,. . . ekles facteurs d’´equilibrage des noeuds rencontr´es `a partir de la racine jusqu’au futur p`ere du noeud `a ins´erer. Soitl le plus grand possible tel que el 6= 0 (l = 0 si lesei sont tous nuls). Montrer que les facteurs d’´equilibrage ek, ek1, . . . el+1 sont modifi´es. Ils passent `a ±1, mais on n’effectue aucun r´e´equilibrage sur les noeuds correspondants. Montrer que les facteurs d’´equilibrage e1, e2, . . . el1 sont inchang´es et que le seul r´e´equilibrage ´eventuel concerne le noeud correspondant `a el. (Il faut montrer que ce r´e´equilibrage diminue forc´ement la hauteur de l’arbre.) Ecrire une version it´erative d’ajoute qui n’utilise pas de pile. Il suffit pour cela, de garder, lors de la descente dans l’AVL, le dernier noeud rencontr´e dont le facteur d’´equilibrage est non nul, puis de reparcourrir le mˆeme chemin dans l’arbre `a partir de ce noeud, pour mettre `a jour les facteurs d’´equilibrage.

Question 7 : Compl´eter la proc´edure

procedure desalloue(a:avl); qui lib`ere la place de tous les noeuds contenus dansa.

Question 8 : Compl´eter la proc´edure const n=1000;

type tab=array[1..n] of element;

procedure triavl(var t:tab);

qui trie le tableau t en mettant d’abord tous ses ´el´ements dans un AVL.

3

Références

Documents relatifs

Informatique théorique/Théoretical Informaties (vol. — Considering only deletions performed in an AVL-tree with n leaves, we show that the total rebalancing time for n

Les AVL sont d’abord des arbres de recherche, ils sont donc tels que tout nœud a une clé supérieure à celles des nœuds de son sous arbre gauche et inférieure à celles des nœuds

Les AVL sont d’abord des arbres de recherche, ils sont donc tels que tout nœud a une clé supérieure à celles des nœuds de son sous arbre gauche et inférieure à celles des nœuds

Dans un arbre binaire de recherche, en général, est-ce qu'il est plus coûteux de trouver l’enfant d'un noeud ou de faire une rotation autour d'un

On calcule toujours l’indice de la premi`ere occurrence du plus petit ´el´ement du tableau, mais en consid´erant que les nombres n´egatifs sont plus grands que les positifs..

Trouver une condition sur b pour que la fonction ϕ(x) soit une contraction sur l’in- tervalle [1,

[r]

En conclusion, les tests de comparaison des niveaux du facteur f2, avec la correction de Bon- ferroni, sont corrects avec les deux commandes, mais les valeurs moyennes, en