Arbre binaire

Arbre binaire - Algo - Programmation

Marsh Posté le 23-12-2005 à 09:46:31    

J'ai un problème que je n'arrive pas à résoudre. Il faut écrire une fonction en algorithmique qui prend en entrée un expression arithmétique complètement parenthésée et qui renvoie l'arbre binaire correspondant. Les seules opérations ont + - * /. Par exemple pour (a + b) ca renvoie un arbre de racine + de sous arbre gauche a et de sous arbre droit b. La structure est :  
structure  noeud {
                         val : élément
                         gauche : pointeur sur noeud
                         droite : pointeur sur noeud
                        }
C'est écrit qu'on peut aussi utiliser le type ABExp=pointeur sur noeud mais je ne sais pas ce que c'est!
Merci de m'aider

Reply

Marsh Posté le 23-12-2005 à 09:46:31   

Reply

Marsh Posté le 23-12-2005 à 09:57:59    

fallait suivre tes cours avant d'aller en TD :spamafote:

Reply

Marsh Posté le 23-12-2005 à 09:59:41    

désolé mais j'ai jamais fait ça en cours, je sais faire tout ce qui passe de l'arbre binaire à une expression arithmétique mais dans l'autre sens je sais pas

Reply

Marsh Posté le 23-12-2005 à 10:28:17    

C'est quoi une xepression arithmétique complèetement parenthésée?
 

Reply

Marsh Posté le 23-12-2005 à 10:41:14    

c'est par exemple  
(((a + b) / (c + d)) + (e * f)) et alors là la racine de l'arbre d'est plus les sous arbre gauche c'est l'arbre représentant ((a + b) / (c + d))  et le droit c'est l'arbre représentant (e * f)

Reply

Marsh Posté le 23-12-2005 à 10:45:00    

AAAhhh ok, ca simplifie les choses.... bon je fais un algo et je le poste...

Reply

Marsh Posté le 23-12-2005 à 10:46:04    

merci

Reply

Marsh Posté le 23-12-2005 à 10:57:51    

ABExp=pointeur sur noeud  
=> Ca doit vouloir dire que tu dois pouvoir spécifier a = c*d par exemple.
Donc au debut tu aurais:
 
    +
  /  \
 a    b
 
Si tu dis que a = c * d tu aurais
 
 
    +
   / \
  *   b
 / \  
c   d
 
Ci dessous voila un algo fait en C++, sans pouvoir le compiler donc propablement avec des erreurs, mais je pense que tu peux t'en inspirer pour faire ca en langage algorithmique. Si tu as des questions, n'hésite pas.
 
structure  noeud {
                  val : élément
                  gauche : pointeur sur noeud
                  droite : pointeur sur noeud
                 }  
 
 
int main void  
{
noeud racine;
 
string expression = "(((a+b)/(c+d))+(e*f))";
 
creer_arbre (expression, racine);
 
}
 
int creer_arbre (string exp, noeud & racine)
{
int nb = 0;  
 
 for (i=0;i<exp.length;i++)
 {
  if (exp[i] == '(')
  {
   nb++;
  }  
  else
  if (exp[i] == ')')
  {
   nb--;
  }  
  else
  if (nb == 1)
  {
   racine.val = exp[i];
   racine.gauche = new noeud ();
   creer_arbre (substr (exp,1,i-1),racine.gauche);
   racine.droite = new noeud ();
   creer_arbre (substr (exp,i+1,exp.length-1),racine.droite);    
  }  
 
 }
}
 
 

Reply

Marsh Posté le 26-12-2005 à 21:06:58    

j'ai juste une question très bete surement mais comme j'ai jamais fait de C ou de C++, qu'est-ce que ça veut dire quand on dit i++?

Reply

Marsh Posté le 26-12-2005 à 21:13:09    

i = i + 1
 
=> et ça retourne la nouvelle valeur de i

Reply

Marsh Posté le 26-12-2005 à 21:13:09   

Reply

Marsh Posté le 26-12-2005 à 21:13:39    

++i ça fait pareil, mais ça retourne la valeur initiale de i (avant incrémentation)
 
on peut faire pareil avec --

Reply

Marsh Posté le 08-01-2006 à 22:23:58    

Je crois qu'il y a une petite ambiguité a soulever :
 
x = i++; x vaut alors la valeur de i avant incrémentation.
x = ++i; x vaut alors la valeur de i apres incrémentation.
 
Dans tout les cas, après l'instruction la valeur de i est bien incrémenté.

Reply

Marsh Posté le 09-01-2006 à 09:39:52    

Normalement c'est ça (vérifie quand même, parceque pour une affectation, c'est pas toujours évident)

Reply

Marsh Posté le 09-01-2006 à 18:03:19    

vivi c'est ça :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed