Erlang 二叉树函数
Erlang Binary Tree function
我有一个完美二叉树,每个节点都是这样表示的
[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].
所以我有returns最后一个左边的叶子
的功能
lastLeftLeaf([H, [], []]) ->H;
lastLeftLeaf([H, Left, Right]) ->lastLeftLeaf(Left).
在我们的例子中 returns 4 :L1 的值。
并且 returns 树没有最后离开的功能 leaf:it 将此叶子替换为 []
withoutLastLeftLeaf([H, [], []]) ->[] ;
withoutLastLeftLeaf([H, Left, Right]) ->[H, withoutLastLeftLeaf(Left), Right].
在我们的示例中,它 returns 没有 L1 的树:替换为 []
这两个函数进行相同的浏览并获得结果我必须进行两次浏览,为了提高性能和效率我想创建一个只用一次浏览的函数 returns 两个结果:最后一个左边的叶子没有那片叶子的树有任何帮助,谢谢大家。
您可以组合您编写的两个函数,并使新函数 return 成为 {Value, NewTree}
形式的结果。对于你已经在叶子的情况,很简单:
take_last_left_leaf([H, [], []]) -> {H, []};
然后,在树中的任何其他点,您将递归到左分支,获取值和新的左分支,然后 return 值以及修改后的树:
take_last_left_leaf([H, Left, Right]) ->
{Value, NewLeft} = take_last_left_leaf(Left),
{Value, [H, NewLeft, Right]}.
我有一个完美二叉树,每个节点都是这样表示的
[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].
所以我有returns最后一个左边的叶子
的功能lastLeftLeaf([H, [], []]) ->H;
lastLeftLeaf([H, Left, Right]) ->lastLeftLeaf(Left).
在我们的例子中 returns 4 :L1 的值。 并且 returns 树没有最后离开的功能 leaf:it 将此叶子替换为 []
withoutLastLeftLeaf([H, [], []]) ->[] ;
withoutLastLeftLeaf([H, Left, Right]) ->[H, withoutLastLeftLeaf(Left), Right].
在我们的示例中,它 returns 没有 L1 的树:替换为 []
这两个函数进行相同的浏览并获得结果我必须进行两次浏览,为了提高性能和效率我想创建一个只用一次浏览的函数 returns 两个结果:最后一个左边的叶子没有那片叶子的树有任何帮助,谢谢大家。
您可以组合您编写的两个函数,并使新函数 return 成为 {Value, NewTree}
形式的结果。对于你已经在叶子的情况,很简单:
take_last_left_leaf([H, [], []]) -> {H, []};
然后,在树中的任何其他点,您将递归到左分支,获取值和新的左分支,然后 return 值以及修改后的树:
take_last_left_leaf([H, Left, Right]) ->
{Value, NewLeft} = take_last_left_leaf(Left),
{Value, [H, NewLeft, Right]}.