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



我正试图使用列表创建一个函数数组,其中包含一个问题中的给定函数从形式上讲,任务是从索引从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));

其中CCD_ 1是来自该问题的给定函数。但是我想不出使用这个函数的方法。此外,我不知道为什么我的解决方案不起作用。。。。

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

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

但我不会使用addnode,我不知道应该在分支的右边放什么。

任何帮助都将不胜感激。。。

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

当然,这个问题很奇怪,因为这种方法不可避免地会创建一个尽可能不平衡的退化树,因此并不比使用纯列表来表示数组更有效。

最新更新