sml函数,它接受BST数据类型并按顺序返回列表

时间:2015-02-17 20:34:54

标签: sml

我有BST功能,插入数字就像这样

val t =节点(节点(空,10,空),20,节点(空,30,空)):BST

如何编写一个接受val t的函数并返回BST中的顺序列表,如[10,20,30]

非常感谢你!

1 个答案:

答案 0 :(得分:0)

通常你会使用 inorder 树遍历算法。它从根节点开始,处理左子树,然后处理当前节点,最后处理右子树。

但是在这种特殊情况下,标准的从左到右的顺序遍历是非常低效的,因为它将使用列表的追加操作,即O(n)。

为了能够使用列表的前置操作(它是常量时间O(c)),您最好先处理右子树,然后处理当前节点值,最后继续处理左子树。你基本上是从右到左折叠树。因此,您可以定义一个简单的辅助函数 foldr

fun foldr f a Empty = a
  | foldr f a (Node (left, n, right)) = foldr f (f (n, foldr f a right)) left

并用它来定义 toList 函数:

val toList = foldr (op ::) []