On considère dans cet exercice des arbres enracinés dans lesquels chaque nœud a soit deux enfants (c'est un nœud interne), soit aucun (c'est un nœud externe).
L'illustration ci-dessous présente un tel arbre. Les nœuds internes sont représentés par des cercles, les nœuds externes par des carrés.
Afin de représenter les arbres en machine on numérote les nœuds dans un ordre quelconque. Cette étape étant réalisée, on peut représenter les arbres en machine par des listes d'adjacences (des dictionnaires avec Python) dont les clés sont les numéros des nœuds internes et les valeurs associées une liste contenant les numéros de leurs deux enfants.
L'arbre dessiné ci-dessus est représenté par le dictionnaire {0:[1,2],1:[4,5],2:[6,3],3:[7,8]}. Les nœuds externes de numéros 4, 5, 6, 7 et 8 ne sont pas des clés du dictionnaire.
Pour calculer les longueurs présentées dans la suite, on utilise des parcours en profondeur.
1. Longueur de cheminement externe
On s'intéresse à la longueur de cheminement externe qui est la somme des longueurs de tous les chemins allant de la racine à un nœud externe. Pour l'arbre dessiné plus haut, cette longueur vaut \(2+2+2+3+3=12\).
Écrire une fonction récursivelongueur_ce qui prend en paramètres un dictionnaire représentant un arbre et deux entiers désignant un nœud et une longueur. Cette fonction renvoie la longueur de cheminement externe de l'arbre considéré.
Pour l'appel initial, les arguments passés à la fonction sont l'arbre dont on veut obtenir la longueur de cheminement externe, le numéro du nœud racine et 0 pour la longueur.
On affecte désormais un poids à chaque nœud externe. Les différents poids sont donnés par un dictionnaire {numéro_du_noeud_externe:poids}.
On s'intéresse à la longueur de cheminement externe pondérée qui est la somme des longueurs de tous les chemins allant de la racine à un nœud externe, chaque chemin étant pondéré (multiplié) par le poids affecté au nœud externe correspondant.
Considérons par exemple les deux arbres ci-dessous :
Pour l'arbre à gauche, on obtient \(2\times4 +2\times1+2\times9+2\times2= 32\). Pour celui à droite \(1\times9+2\times4+3\times1 +3\times2=26\) .
Écrire une fonction récursivelongueur_ce_ponderee qui prend en paramètres un dictionnaire représentant un arbre, un autre donnant les poids des nœuds externes et deux entiers donnant le numéro du nœud racine et une longueur. Cette fonction renvoie la longueur de cheminement externe pondérée de l'arbre considéré.
On s'intéresse enfin à la longueur de cheminement interne qui est la somme des longueurs de tous les chemins allant de la racine à un nœud interne. Pour l'arbre dessiné au début de l'exercice, cette longueur vaut \(1+1+2=4\).
Écrire une fonction récursivelongueur_ci qui prend en paramètres un dictionnaire représentant un arbre et deux entiers désignant un nœud et une longueur. Cette fonction renvoie la longueur de cheminement interne de l'arbre considéré.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)