salut a tous !
S.V.P, Je cherche l'algorithme de suppression d'un élément dans un arbre binaire de recherche !
voila mes essais
j'ai trouvé l'idée sur wiki (mais honnêtement j'ai pas pu le faire):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 type abr=^elt; elt=enregistrement val:entier; g,d:abr; fin; ...... ...... ...... fonction recherche(a:abr;v:entier):abr debut si (a=null)alors recherche<==null sinon si (a^.val=v)alors recherche<==a sinon si (a^.val>v) alors recherche <==recherche(a^.g,v) sinon recherche <==recherche (a^.d,v); fin; ...... ...... ...... fonction succ(var a:abr):abr var p:abr; debut si (a<>null)alors debut si (a^.d<>null) alors debut p<==a^.d; tantque(p^.g^.g<>null)alors p<==p^.g; fin; succ<==p; fin; fin; ...... ...... ...... procedure supp(a:abr;v) var x:abr; debut x<==recherche(a,v); si (x=null)alors ecrire"la valeur que vous voulez supprimé nexiste pas dans cet arbe" sinon debut si((x^.g=null)et(x^.d=null)) alors dispose(x) sinon si ((x^.d<>null)et(x^.g=null))alors debut s<==succ(x); x^.val<==s^.val; dispose(s); fin sinon si((x^.d<>null)et(x^.g<>null))alors debut s<==succ(x); x^.val<==s^.val; dispose(s); fin sinon debut x^.val<==x^.g^.val; dispose(x^.g); fin; fin;
plusieurs cas sont à considérer, une fois que le nœud à supprimer a été trouvé à partir de sa clé :
* Suppression d'une feuille : Il suffit de l'enlever de l'arbre vu qu'elle n'a pas de fils.
* Suppression d'un nœud avec un enfant : Il faut l'enlever de l'arbre en le remplaçant par son fils.
* Suppression d'un nœud avec deux enfants : Supposons que le nœud à supprimer soit appelé N (le nœud de valeur 7 dans le graphique ci-dessous). On le remplace alors par son successeur le plus proche (le nœud le plus à gauche du sous-arbre droit - ci-dessous, le nœud de valeur 9) ou son plus proche prédécesseur (le nœud le plus à droite du sous-arbre gauche - ci-dessous, le nœud de valeur 6). Cela permet de garder une structure d'arbre binaire de recherche. Puis on applique à nouveau la procédure de suppression à N, qui est maintenant une feuille ou un nœud avec un seul fils.
Pour une implémentation efficace, il est déconseillé d'utiliser uniquement le successeur ou le prédécesseur car cela contribue à déséquilibrer l'arbre.
Dans tous les cas cette opération requiert de parcourir l'arbre de la racine jusqu'à une feuille : le temps d'exécution est donc proportionnel à la profondeur de l'arbre qui vaut n dans le pire des cas, d'où une complexité maximale en O(n).
Partager