如何使用标准ML创建由二叉树表示的功能数组?

时间:2017-10-27 17:52:40

标签: arrays recursion functional-programming binary-tree sml

我正在尝试使用列表创建一个函数数组,并使用问题中的给定函数。 正式来说,任务是从列表中创建一个功能数组,索引从1开始。

但是,我在这项任务中陷入困境几天没有任何进展。希望得到一些提示来完成这件事。

这就是我所做的:

datatype 'a tree = Leaf 
                 | Branch of 'a * 'a tree * 'a tree

fun addnode a Leaf = Branch (a, Leaf, Leaf)
      | addnode a (Branch (b, tree1, tree2)) = Branch (a, addnode b tree2, tree1);

fun functionalarray (0, a) = Leaf
    | functionalarray(n, a::b::r) = Branch(a, functionalarray(n div 2, r), functionalarray(n-1 div 2, b::r));

其中addnode是问题中的给定函数。但我想不出使用这个功能的方法。另外,我不知道为什么我的解决方案不起作用....

我想如果我必须使用给定的函数,我需要执行n mod 2,如果n是偶数,那么我需要递归调用functionalarray在左边创建一个新的分支,如果n mod 2 = 1和n是奇数,那么我在右边创建一个新分支。但是,如果我这样做,那么我不知道在分支的左侧或右侧放置什么。例如,我可以调用类似

的内容
if n mod 2 = 0 then Branch(a, functionalarray(n div 2, r), ...

但我不会使用addnode而且我不知道我应该把它放在分支的右边。

非常非常感谢任何帮助......

1 个答案:

答案 0 :(得分:0)

addnode函数在树的最左边位置插入一个新元素,即作为它所代表的数组的第一个元素。通过这样做,所有现有元素在结果数组中有效地向上移动一个索引。因此,您需要做的就是从右到左迭代输入列表,并为每个元素应用addnode,从空数组开始。提示:这是一个List.foldr的单行。

当然,这个问题很奇怪,因为这种方法不可避免地会产生一个退化的树,它可以得到不平衡的树,因此没有比使用普通列表来表示数组更有效。