【问题标题】:Erlang Binary Tree functionErlang 二叉树函数
【发布时间】:2020-08-12 02:53:51
【问题描述】:

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

[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 的树:替换为 []

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

【问题讨论】:

  • “我想创建一个函数”——去做吧。
  • 好吧,告诉我我怎么无法实现

标签: tree erlang binary-tree


【解决方案1】:

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

take_last_left_leaf([H, [], []]) -> {H, []};

然后,在树中的任何其他点,您将递归到左分支,获取值和新的左分支,然后将值与修改后的树一起返回:

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

【讨论】:

  • 谢谢legoscia,这非常天才,你帮了我很多,所以谢谢你,Erlang 语言的难点在于没有通用规则,不像我使用的所有其他语言,在这个例子中我注意到你已经从上一个构建递归了,这对我来说是新的想法。
  • 我尝试解决复杂的高级算法,例如所有类型的列表排序和动态编程,所以我认为这是 erlang 语言的一个很好的实践,谢谢 legoscia
  • 确实!我这里使用的原理类似于en.wikipedia.org/wiki/Mathematical_induction——首先编写一个函数子句来处理最简单的情况(叶节点),然后编写一个函数子句将解决方案应用于更大的情况。
  • ues 我知道这是递归原理,我已经使用了很长时间,但是使用 erlang 对我来说有点陌生,由于语法有限,我发现实现递归算法有些困难语言,例如这个 Tree 函数在 Java 中将非常简单,我只使用 withoutLastLeftLeaf 函数,然后在最后一种情况下,在叶子级别我使用一个全局变量,该变量在函数结束后有界
  • legoscia 你有任何网站或 pdf 用于硬 erlang 算法练习吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多