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.

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 code du fichier header :

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);
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
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);
}
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
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;
}
Etant débutant en C++, je suis sûr que vous trouverez plus vite que moi les réponses à ces problèmes.

Je vous en remercie d'avance.

beegees