Bonjour tout le monde,
J'ai récupéré un code sur internet pour tester les arbres binaires.
J'ai fais un copier/coller, j'ai crée le fichier header et deux fichiers cpp mais j'ai des erreurs que je ne comprends pas.
Voici le code du fichier header :ArbreRecursif.cpp
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(5) : error C2065: 'arbre' : undeclared identifier
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(5) : error C2440: 'initializing' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(6) : error C2065: 'NULL' : undeclared identifier
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(6) : error C2440: 'initializing' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(11) : error C2440: '=' : cannot convert from 'struct Noeud *' to 'int'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(40) : error C2440: '=' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(41) : error C2440: '=' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(49) : error C2440: 'initializing' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(67) : error C2440: 'initializing' : cannot convert from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(70) : error C2446: '==' : no conversion from 'int' to 'struct Noeud *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(70) : error C2040: '==' : 'struct Noeud *' differs in levels of indirection from 'int'
Z:\Graduat\Algo\Cours 2007-2008\03 12 07 Récursivité\Recursivite2\ArbreRecursif.cpp(72) : error C2440: '=' : cannot convert from 'struct Noeud *' to 'int'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Error executing cl.exe.
Recursivite2.exe - 12 error(s), 0 warning(s)
Voici le main :
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 struct Noeud { int valeur; Noeud* fils_droite; Noeud* fils_gauche; }; void Placer(Noeud* noeud); void Ajouter(int valeur); Noeud* Rechercher(int valeur); void Supprimer(Noeud* noeud);
et voici le fichier qui pose problème :
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 #include "arbreRecursif.h" #include <iostream> Noeud* arbre = NULL; void Afficher(Noeud* racine); int main(void) { Ajouter(10); Ajouter(4); Ajouter(15); Ajouter(2); Ajouter(16); Ajouter(1); Ajouter(9); Ajouter(14); Afficher(arbre); Noeud* n = Rechercher(4); Supprimer(n); Afficher(arbre); return 0; } void Afficher(Noeud* racine) { if(racine->fils_gauche) Afficher(racine->fils_gauche); std::cout << racine->valeur << std::endl; if(racine->fils_droite) Afficher(racine->fils_droite); }
Etant débutant en C++, je suis sûr que vous trouverez plus vite que moi les réponses à ces problèmes.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 #include "arbreRecursif.h" void Placer(Noeud* noeud) { Noeud* courant = arbre; Noeud* precedent = NULL; // Si l'arbre est vide, ça va très vite : if(arbre == NULL) { arbre = noeud; return; } // On se fraye un chemin jusqu'a une place vide while(courant) { precedent = courant; if(noeud->valeur < courant->valeur) courant = courant->fils_gauche; else courant = courant->fils_droite; } // Hop, on a trouvé une place libre, et // precedent pointe vers le parent de notre // noeud à replacer. if(noeud->valeur < precedent->valeur) precedent->fils_gauche = noeud; else precedent->fils_droite = noeud; } void Ajouter(int valeur) { // Création de notre nouveau noeud en mémoire Noeud* nouveau = new Noeud; nouveau->valeur = valeur; nouveau->fils_droite = NULL; nouveau->fils_gauche = NULL; // Puis on laisse Placer() le mettre à la bonne place Placer(nouveau); } Noeud* Rechercher(int valeur) { Noeud* courant = arbre; while(courant) { if(valeur == courant->valeur) return courant; else if(valeur < courant->valeur) courant = courant->fils_gauche; else courant = courant->fils_droite; } return NULL; } void Supprimer(Noeud* noeud) { Noeud* droite = noeud->fils_droite; Noeud* gauche = noeud->fils_gauche; Noeud* courant = arbre; // Cas délicat : si on supprime la racine? if(noeud == arbre) { arbre = droite; if(gauche) Placer(gauche); delete noeud; return; } while(courant) { if(courant->fils_droite == noeud || courant->fils_gauche == noeud) break; if(noeud->valeur >= courant->valeur) courant = courant->fils_droite; else courant = courant->fils_gauche; } // Courant pointe maintenant vers le noeud précédent le // noeud à supprimer. if(courant->fils_droite == noeud) courant->fils_droite = droite; else courant->fils_gauche = droite; // Et puis on replace l'autre fils du noeud disparu if(gauche) Placer(gauche); // Enfin, on libère l'objet noeud de ses obligations delete noeud; }
Je vous en remercie d'avance.
beegees
Partager