Tree Erlang二叉树函数

Tree Erlang二叉树函数,tree,erlang,binary-tree,Tree,Erlang,Binary Tree,我有一个完美的二叉树,每个节点都是这样表示的 [Value, LeftNode, RightNode] [Value, [], []] 值是节点值和 每个LeftNode和RightNode都是节点的子节点,它们递归地都是二叉树。 最后的节点(叶子)是这样表示的 [Value, LeftNode, RightNode] [Value, [], []] 例如: L1=[4, [], []], L2=[5, [], []], L3=[6, [], []], L4=[7, [], [

我有一个完美的二叉树,每个节点都是这样表示的

[Value, LeftNode, RightNode] 
[Value, [], []]
值是节点值和 每个LeftNode和RightNode都是节点的子节点,它们递归地都是二叉树。 最后的节点(叶子)是这样表示的

[Value, LeftNode, RightNode] 
[Value, [], []]
例如:

L1=[4, [], []], 
L2=[5, [], []], 
L3=[6, [], []], 
L4=[7, [], []], 
L5=[2, L1, L2], 
L6=[3, L3, L4], 
Tree=[1,L5 , L6].
我有一个函数,返回最后一个左叶

lastLeftLeaf([H, [], []]) ->H;
lastLeftLeaf([H, Left, Right]) ->lastLeftLeaf(Left). 
在我们的示例中,它返回4:L1的值。 以及返回没有最后一个左叶的树的函数:它将此叶替换为[]

withoutLastLeftLeaf([H, [], []]) ->[] ;
withoutLastLeftLeaf([H, Left, Right]) ->[H, withoutLastLeftLeaf(Left), Right].
在我们的示例中,它返回不带L1:的树,L1:替换为[]


这两个函数都执行相同的浏览,为了获得结果,我必须执行两次浏览,为了提高性能和效率,我想创建一个只包含一次浏览的函数,该函数返回两个结果:最后一个左叶和没有该叶的树。任何帮助,谢谢大家

您可以组合您编写的两个函数,并让新函数以
{Value,NewTree}
的形式返回结果。对于已经在leaf的情况,很简单:

take_last_left_leaf([H, [], []]) -> {H, []};
然后,在树中的任何其他点,您将递归到左分支,获取值和新的左分支,然后返回值以及修改后的树:

take_last_left_leaf([H, Left, Right]) ->
    {Value, NewLeft} = take_last_left_leaf(Left),
    {Value, [H, NewLeft, Right]}.

“我想创建一个函数”-就这么做吧。好吧,告诉我我怎么会意识不到这一点谢谢你Legossia这是一个天才,你帮了我很多所以谢谢你,Erlang语言的困难在于没有通用规则,不像我用的所有其他语言,在这个例子中,我注意到你已经从上一个开始构建了递归性,这对我来说是一个新的想法。我试图解决复杂的高级算法,比如所有类型的列表排序和动态编程,所以我认为这是erlang语言的一个很好的实践。谢谢你!我在这里使用的原理类似于-首先编写一个函数子句来处理最简单的情况(叶节点),然后写一个函数子句,将解决方案应用于更大的情况。我知道这是递归原理,我使用它很长时间了,但对于erlang来说有点陌生,我发现实现递归算法有一些困难,因为语言的语法有限,所以举个例子,这个树函数将非常有用在Java中很简单,我只使用withoutLastLeftLeaf函数,然后在最后一种情况下,在LEFS级别,我使用一个全局变量,该变量在函数结束后是有界的。OSCIA您有任何站点或pdf用于硬erlang算法练习吗?