NB: je te le mets en Common LISP pcq ma syntaxe scheme est un peu rouillée mais tu devrais t'y retrouver:
Tu ne donnes pas trop de précision sur la façon dont tu représentes l'arbre binaire. J'imagine que chaque noeud est soit nul, soit un atome, soit une liste de 3 noeuds, par ex:
'(1 2 3)
<=>
1
/\
23
'(1 2)
<=>
1
/\
2 Nil
Donc pour chacune de tes fonctions tu aurais, par ex:
1 2 3 4 5 6 7 8 9 10 11
| (defun somme-labels (node)
(cond
((null node) 0)
((atom node) node)
(T (+ (car node) (somme-labels (cadr node)) (somme-labels (caddr node))))))
(defun count-leaves (node)
(cond
((null node) 0)
((atom node) 1)
(T (+ (count-leaves (cadr node)) (count-leaves (caddr node)))))) |
On peut donc capitaliser sur la ressemblance de structure entre les deux et renvoyer un résultat sous forme de tuple.
Je définis en premier lieu une fonction pour additionner 2 tuples:
1 2 3 4
| (defun add-cons (a b &rest r)
(let ((s (cons (+ (car a) (car b)) (+ (cdr a) (cdr b)))))
(if (null r) s
(add-cons s (car r) (cdr r))))) |
Et je l'utilise dans la fonction composée:
1 2 3 4 5
| (defun somme-labels-nombre-feuilles (node)
(cond
((null node) (cons 0 0)
((atom node) (cons node 1)
(T (add-cons (cons node 0) (somme-labels-nombre-feuilles (cadr node)) (somme-labels-nombre-feuilles (caddr node)))))) |
Bien évidemment il faut adapter pour ton dialecte et la façon dont tu représentes l'arbre
Partager