我正在尝试编写代码来检查 n 叉树在 clisp 中是否平衡。树是这样给出的:
(A (B (E (I))(F))(C (G))(D))
这看起来像:
A
/ | \
B C D
/\ |
E F G
|
I
这将是不平衡的。
我正在考虑使用以下方法解决它:
一个字母的所有叶子的最大级别 - 所有叶子的最小级别不应大于 1。
我考虑先将这条规则应用于 A、B、C。如果差值不大于 1,则检查 E、F、G,直到我检查了所有可能的字母并且树是平衡的,或者我得到的差值大于 1,这意味着它不平衡。
这是最小/最大级别的代码:
(defun nrlvlmax (tail)
(cond
( (null tail) 0)
( (listp (car tail)) (max ( + 1 (nrlvl (car tail))) (nrlvl (cdr tail))))
( t (nrlvl (cdr tail)))
)
)
我不知道如何解析列表并应用我的规则。我不应该使用地图/兰巴功能,只喜欢基础知识。如何解析给定的列表?