On considère un arbre binaire et on associe à chaque nœud une étiquette (en anglais label) contenant un opérateur binaire1. Les nœuds sont numérotés 0, 1, 2, ...
À un arbre binaire étiqueté ne contenant que des opérateurs, on peut associer un arbre étiqueté en ajoutant des opérandes comme ci-dessous.
L'arbre binaire à gauche correspond à l'expression: \(((.+.)\times (. - (. / .)))\).
L'arbre à droite correspond à l'expression: \(((a+b)\times (c - (d / e)))\).
Les opérandes \(a\), \(b\), \(c\), \(d\), \(e\) peuvent êtres des variables ou des nombres.
La numérotation des nœuds permet de représenter les arbres avec deux dictionnaires :
un dictionnaire des liens dans lequel les clés sont les numéros des nœuds internes. La valeur associée à une clé est la liste ordonnée donnant les numéros des deux enfants du nœud étudié ;
un dictionnaires des étiquettes associant à chaque numéro de nœud de l'arbre, l'étiquette de celui-ci.
On remarquera que les nœuds étiquetés avec des opérandes ne sont pas des clés du premier dictionnaire.
Exemple
L'arbre de la figure ci-dessus est représenté par :
le dictionnaire des liens arbre={0:[1,2],1:[4,5],2:[6,3],3:[7,8]} ;
le dictionnaire des étiquettes labels={0:'*',1:'+',2:'-',3:'/',4:'a',5:'b',6:'c',7:'d',8:'e'}.
Ce couple arbre et labels correspond à l'expression :
\[((a+b)\times (c - (d / e)))\]
qui est noté '((a+b)*(c-(d/e)))' en machine.
En modifiant la valeur des étiquettes en labels={0:'+',1:'-',2:'/',3:'*',4:'0',5:'1',6:'2',7:'3',8:'4'}, on obtient l'expression :
\[((0-1)+(2 /(3 * 4)))\]
qui est noté '((0-1)+(2/(3*4)))' en machine.
Écrire une fonction récursive expression qui prend en paramètres :
les deux dictionnaires représentant un arbre et ses étiquettes,
un entier donnant le numéro de la racine.
Cette fonction renvoie l'expression parenthésée correspondant à l'expression arithmétique modélisée par les paramètres.
un opérateur binaire est un opérateur agissant sur deux opérandes. L'addition est un opérateur binaire : on additionne deux nombres. La racine carrée n'est pas un opérateur binaire : on calcule la racine carrée d'un nombre. ↩
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)