Partie 2
Pour le cas où la suite récurrente entière considérée est définie pour un un sur la base de plusieurs
prédécesseurs (comme pour le cas de la suite de Fibonacci), on peut utiliser une structure de données
arborescente pour représenter ses éléments. Par exemple, pour représenter la suite de Fibonacci, on
peut utiliser un arbre binaire. On aurait ainsi, pour représenter f0 et f1 des arbres restreints chacun à un
unique nœud dont les valeurs seraient respectivement 1 et 1. Pour représenter fn avec n > 1, il faudrait
un arbre dont la racine aurait pour valeur fn et possédant deux fils, le fils gauche représentant fn-1, et le
fils droit fn-2. Par exemple, f3 serait représenté par un arbre dont la racine aurait pour valeur f3, et dont le
fils gauche de valeur f2, aurait lui-même pour fils gauche le nœud représentant f1, et pour fils droit le
nœud représentant f0. De plus, la racine aurait pour fils droit le nœud représentant f1. Dans cette partie,
nous représenterons des arbres binaires avec les types C suivants :
typedef struct triplet
{ int valeur;
!! struct triplet *fg;
!! struct triplet *fd;
} noeud;
typedef noeud *arbre;
Question 5. On se pose la même question que précédemment en considérant cette fois-ci un arbre
binaire. Ecrire une fonction C appelée fibabr qui prend en entrée un entier n puis renvoie la valeur de
fn et construit un arbre binaire défini comme ci-dessus, c’est-à-dire dont les nœuds contiennent les
valeurs correspondantes dans la suite de Fibonacci. La fonction C aura donc dans ses arguments, un
pointeur vers l’arbre ainsi construit. Evaluez la complexité en temps et en espace de votre fonction.
Question 6. Démontrez que le nombre de feuilles de l’arborescence binaire construite dans la question 6,
est précisément égal à la valeur de fn.
Question 7. Ecrire une fonction C qui prend en entrée un arbre binaire résultant de l’exécution de la
fonction fibabr avec un entier n en entrée qui fournit la valeur de fn comme résultat, sans utiliser le
champ valeur du type noeud mais par le simple dénombrement des feuilles de l’arborescence (cf.
exploitation de la question 6).
Question 8. Il existe une structure de données, abusivement appelée «"arbres cousus"» qui permet un
gain significatif d’espace pour la représentation d’arbres quand certains nœuds sont répétés. Le type C
permettant de les représenter est identique au précédent, la différence se présentant au niveau de
l’exploitation qui en est faite. Dans un tel arbre, si deux nœuds possèdent un fils de même nature, alors
un seul nœud sera utilisé pour le représenter et les deux nœuds se partageront ce même fils. Par exemple,
l’arbre associé à f3 serait représenté par une structure de données ne contenant que 4 nœuds. La racine
qui aurait pour valeur f3, aurait un fils gauche de valeur f2, et un fils droit représentant f1. Le nœud
représentant f2 aurait pour fils droit le nœud représentant f0, alors qu’il aurait comme fils gauche (de
valeur f1) le nœud fils droit de la racine. Ecrire une fonction C qui prend en entrée un entier n, construit
un arbre cousu défini comme indiqué ci-dessus, puis renvoie la valeur de fn. La fonction C aura donc
dans ses arguments, un pointeur vers l’arbre cousu ainsi construit. Evaluez la complexité en temps et en
espace de votre fonction.