二叉树的 Erlang 泛型 foldl/3 等价物

Erlang generic foldl/3 equivalent for binary trees

我需要为二叉树编写 lists:foldl/3 的等价物。

每个节点表示为:

[Value, LeftNode, RightNode]

因此,一棵树的根为 2,叶子为 1 和 3,如下所示: [2, [1, [], []], [3, [], []]]

以后我想用那个函数来进行操作,比如把那棵树中的所有正值求和等等

这是我写的函数:

tree_foldl(_, Acc, []) -> Acc;
tree_foldl(Fun, Acc, [V, L, R]) ->
X1 = tree_foldl(Fun, Fun(V, Acc), L),
X2 = tree_foldl(Fun, Fun(L, X1), R),
X2.

问题是它不是真正通用的,当我们有时,假设一棵只有根的树,例如: [2, [], []]

它同时调用 Fun(2, 0)Fun([], 2),当尝试对第二种情况下的值求和时,它会尝试执行 [] + 2,这是一个无效的表达式。它也会在更复杂的情况下中断。

对于修复此功能的任何帮助,我将不胜感激。谢谢。

首先,在这种情况下,您应该使用元组而不是列表作为节点。列表是其元素之间的链表,而元组使用连续内存(您可以访问元组的单个元素而无需处理结构的前导元素)。

不需要Fun(L, X1):

tree_foldl(_, Acc, []) -> Acc;
tree_foldl(Fun, Acc, [V, L, R]) ->
    Acc0 = Fun(V, Acc),
    Acc1 = tree_foldl(Fun, Acc0, L),
    Acc2 = tree_foldl(Fun, Acc1, R),
    Acc2.

如果节点为空,什么都不做,否则运行节点上的Fun并在两个子树上递归。