[Ce post est un peu à cheval entre le C++ et l'algorithmique, veuillez m'en excuser]
Bonjour tout le monde.
Je suis en train d'implémenter un arbre rouge et noir en C++. Il est évident qu'il existe de nombreuses librairies sur le net l'ayant déjà implémenté. De même l'utilisation de la STL m'avancerait beaucoup. Cependant, débutant en C++ mais aussi ne maîtrisant pas encore parfaitement les arbres équilibrés et tout ce qui va avec, j'essaye de coder tout cela moi même dans le but de mieux comprendre et de parfaire mes connaissances en C++.
Je n'ai pour l'instant qu'une partie de l'interface de la classe Arbre_RN et une partie de la classe Noeud (je l'utilise aussi pour une liste chaînée en mettant les pointeurs gauche, droite et père à NULL, la couleur, rouge ou noir, n'intervenant pas non plus).
Sans plus attendre, un petit bout de code avant quelques questions![]()
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 #define RED true #define BLACK false class noeud { public: noeud ( const int & info, noeud * suiv = NULL ) // constructeur1 { Cle = info ; Suivant = suiv ; Gauche = Droite = P = NULL; Couleur = true; } noeud ( noeud * suiv = NULL ) {Suivant = suiv ;} ~noeud (){} noeud * GetGauche() {return Gauche;} noeud * GetDroite() {return Droite;} noeud * GetP() {return P;} int GetCle() {return Cle;} bool GetCouleur() {return Couleur;} private: int Cle ; noeud * Suivant ; noeud * Droite ; noeud * Gauche ; noeud * P ; bool Couleur; } ;
Et la classe Arbre_RN :
Comme tout le monde peut le constater, c'est loint d'être complet et même parfait
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 #include "NOEUD.H" class Arbre_RN { public: Arbre_RN(); ~Arbre_RN(); void Rotation_Gauche (const int &); void Rotation_Droite (const int &); void Supprimer(); void Diminuer_Cle(); void Union(); void Extraire_Minimum(); void Minimum(); void Inserer(const int &); private: };, mais ça va venir
.
J'ai donc quelques questions, si vous pouviez y répondre ce serait bien sympathique, merci![]()
J'essaye de me baser sur les algos du livre "Introduction à l'algorithmique " de Cormen. et je devrais dire de faire le plus possible comme dans le bouquin car c'est avant tout un projet d'algo et non de programmation.
Pour la racine de l'arbre, je suppose qu'un pointeur privé sur un noeud ferait l'affaire ?
Comment implémenter NIL de la même façon que l'algo de Cormen ? ie "Pour un arbre RN T, la sentinelle nil[T] est un objet ayant les mêmes champs qu'un noeud ordinaire. Tous les pointeurs vers NIL, donc les feuilles, sont remplacés par des pointeurs vers la sentinelle nil[T].
La procédure Insérer prend normalement en paramètre un Noeud crée auparavant. N'est-t-il pas possible de simplement passer en paramètre sa Clé puisque c'est la seule information contenue dans le noeud non modifiée après l'insertion ?
Question bête mais je préfere demander confirmation : l'arbre ne gère pas les noeuds... il ne gère que les pointeurs ? Donc je ne sais pas trop comment bien gérer la suppression ou la création des noeuds en mémoire. Par exemple pour la procédure Insérer, en passant juste la clé du noeud à insérer, je pensais faire un "new Noeud" et donc forcément dans la procédure Supprimer faire un "delete"....
Pour le constructeur, tout ce que j'ai à faire, c'est de créer un noeud racine ?
Si je veux implémenter un constructeur par copie., je vais devoir recréer tous les noeuds ? ou bien juste copier les pointeurs ? (cf questions sur la gestion de mémoire merdique)
J'ai surement d'autres questions qui vont venir, mais ça serait bien d'eclaircir tout cela d'abord
![]()
Pour vous donner un peu plus une idée de ce que je fais : je dois implémenter différentes structures de données (liste, arbre RN et tas binomial) qui chacunes vont me servir de file de priorités (en l'occurrence de priorité minimum) pour implémenter divers algos sur les graphes. D'ailleurs je ne sais pas encore représenter mon graphe avec ces structures... mais chaque choses en son temps![]()
Donc je vous remercie déjà d'avoir tout lu, lol. Et suis ouvert à toute suggestion, critique , manière de procéder, lien etc... car j'en aurais bien besoin![]()
Mici beaucoup les amis![]()
Partager