type ('f, 'n) arbre =
| Feuille of 'f
| NoeudInterne of ('f, 'n) arbre * 'n * ('f, 'n) arbre
;;
let arbre =
NoeudInterne (Feuille 2, 1, NoeudInterne (Feuille 4, 3, Feuille 5))
;;
let rec symetrique arbre =
match arbre with
| Feuille _ -> arbre
| NoeudInterne (fils_gauche, noeud, fils_droit) ->
NoeudInterne (symetrique fils_droit, noeud, symetrique fils_gauche)
;;
symetrique arbre;;
1.
let rec initialise_complet n val_f val_n =
match n with
| 0 -> Feuille val_f
| _ -> let arbre = initialise_complet (n - 1) val_f val_n in
NoeudInterne (arbre, val_n, arbre)
;;
initialise_complet 2 1 0;;
2.
Un arbre complet de hauteur $h$ a $2^h$ feuilles de profondeur $h$ chacune. Son cheminement est donc de $h2^h$.
1.
let rec strahler arbre =
match arbre with
| Feuille _ -> 1
| NoeudInterne(fils_gauche, _, fils_droit) ->
let s_g = strahler fils_gauche in
let s_d = strahler fils_droit in
if s_g = s_d then
s_g + 1
else
max s_g s_d
;;
let arbre2 =
let sous_arbre = initialise_complet 2 0 0 in
NoeudInterne(
NoeudInterne(
sous_arbre,
0,
NoeudInterne(
sous_arbre,
0,
Feuille 0
)
),
0,
Feuille 0
)
;;
strahler arbre2;;
2.
Par récurrence sur $h\in\mathbb N$.
3.
Un arbre de hauteur $h\neq0$ possède au moins un noeud interne, donc au moins un noeud avec deux feuilles qui aura $2$ comme nombre de Strahler. Comme le nombre de Strahler d'un noeud est toujours au moins aussi grand que ceux de ses fils, un arbre de hauteur $h\neq0$ a bien un nombre de Strahler au moins égal à $2$.
De plus, ce nombre sera égal à $2$ si et seulement si tous les noeuds internes ont un nombre de Strahler de $2$ (toujours vu la propriété de croissance). Cela signifie que chaque noeud interne doit avoir un fils dont le nombre de Strahler vaut $1$ et un fils dont le nombre de Strahler vaut $2$, ce qui correspond bien au type d'arbre décrit dans la question.