如何用Erlang统计仅有一个子节点的节点?我的代码始终返回0
问题分析与修复
你的代码存在几个关键问题,导致无法正确统计单节点数量,以下是问题点和修复方案:
核心问题
if语句误用:Erlang的if分支条件必须是布尔表达式,你直接用模式匹配(如{Value, Left, empty})作为条件,这是语法错误,if无法识别这种模式。- 递归结果未合并:处理双节点时,你分别递归左右子树,但没有将两个递归的结果相加,导致左子树的计数完全丢失,最终只返回右子树的结果。
- 缺少空节点分支:当遍历到
empty节点时,函数没有对应匹配分支,会触发匹配错误,无法正常终止递归。 - 计数逻辑遗漏:遇到单节点时,你仅累加后递归子节点,但没有将子节点的计数结果与当前累加值结合,导致子树的单节点数量无法被统计。
修复后的代码
helper(empty, Acc) -> Acc; helper({_Value, Left, Right}, Acc) -> case {Left, Right} of {empty, empty} -> Acc; % 叶子节点,不计数 {empty, RightNode} -> % 当前是单右子节点,计数+1后递归右子树 helper(RightNode, Acc + 1); {LeftNode, empty} -> % 当前是单左子节点,计数+1后递归左子树 helper(LeftNode, Acc + 1); {LeftNode, RightNode} -> % 双节点,分别递归左右子树并合并结果 helper(LeftNode, Acc) + helper(RightNode, Acc) end.
代码说明
- 新增
empty分支:直接返回当前累加值,正常终止递归。 - 用
case {Left, Right}替代错误的if:通过模式匹配精准判断节点类型,逻辑更清晰。 - 单节点处理:累加当前节点计数后,递归子树并返回最终结果,确保子树的单节点数量被统计。
- 双节点处理:分别递归左右子树,将两个子树的计数结果相加,得到总数量。
内容的提问来源于stack exchange,提问作者Sunny Dao
相关产品推荐
相关产品推荐

