Bonjour,
Je souhaite implémenter des arbres N-aires, avec une structure de vecteurs, afin de pouvoir construire mon arbre dynamiquement.
J'ai donc crée une classe PrefixNode défini ainsi :
Un PrefixNode comporte donc ses attributs(valeur,niveau,etc...)et un vector de pointeurs vers des PrefixNode. Je ne sais pas si cette structure est optimale, mais elle me semble cohérente.
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 class PrefixNode; typedef string ItemType; typedef vector<PrefixNode*> VectChild; class PrefixNode { private: ItemType Val; int Proba; int Niveau; //Calcul du Niveau void CalculerNiveau(); //calcul la probabilité du noeud courant void CalculerProba(); public: //Liens VectChild Successeurs; PrefixNode* Pere; //Constructeur par défault PrefixNode(){}; //Constructeur PrefixNode(ItemType S){ Val = S; Proba = 0; Niveau = 0; Pere = NULL; } // Accesseurs ItemType getVal() const; int getProba() const; int getNiveau() const; VectChild getChildren() const; PrefixNode* getFather() const; // Mutateurs void setVal(ItemType); void setSuccesseurs(VectChild); void setNiveau(int); //Affichage void PrintNode(); void PrintTree(); //Gestion des noeuds enfants void CreateChildren(ItemType); };
Il semble que j'ai un problème dans la méthode CreateChildren qui ajoute un Noeud Fils au noeud qui appelant ( créé un nouveau fils si aucun fils, ajoute un frère si un ou plusieurs fils est déjà présent). Je vous donne son code :
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 void PrefixNode::CreateChildren(ItemType S){ VectChild::iterator it; VectChild::iterator it2; if (Successeurs.empty()){ //créer 1 fils (Successeurs).push_back(new PrefixNode(S)); it=(Successeurs).begin(); (*it)->Pere = this; (*it)->CalculerNiveau(); (*it)->CalculerProba(); } else{ //creer un frere (Successeurs).push_back(new PrefixNode(S)); it2=(Successeurs).end(); (*it)->Pere = this; (*it)->CalculerNiveau(); (*it)->CalculerProba(); } }
Je teste tout ça en créant d'abord un premier fils, puis en créant ce qui devrai être un frère de ce dernier. Ce qui se fait par le main suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int main() { PrefixNode* racine; racine= new PrefixNode("ROOT"); racine->CreateChildren("FILS1"); (racine)->PrintTree(); (racine)->CreateChildren("FILS11");racine->PrintTree(); return 0; }
A l'éxecution, le programme plante à la création du frère. ça affiche ceci :
...puis ça plante. Le frère "FILS11" n'est pas crée.Je m'arrache les cheveux depuis des heures; donc je fais appel à vos connaissances ! Je débute vraiment en c++, est-il besoin de le préciser ... Merci par avance de votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 + Noeud (0x20fd0) : - Niveau = 0 - Valeur= ROOT - Predecesseur = 0 - Successeurs= { 0x21018 } + Noeud (0x21018) : - Niveau = 1 - Valeur= FILS1 - Predecesseur = 0x20fd0 - Successeurs= { Aucun }
Partager