接收BST数据类型并按顺序返回列表的sml函数

接收BST数据类型并按顺序返回列表的sml函数,sml,Sml,我有一个BST函数,它可以在中插入数字,如下所示 val t=节点(节点(空,10,空),20,节点(空,30,空)):BST 如何编写一个函数,它接受val t并返回BST中的顺序列表,如[10,20,30] 非常感谢你 通常您会使用顺序树遍历算法。它从根节点开始,处理左子树,然后处理当前节点的数据,最后处理右子树 但是在这种特殊情况下,标准的从左到右顺序遍历是非常低效的,因为它将使用列表的追加操作,即O(n) 为了能够使用list的prepend操作(即常量时间O(c)),您最好先处理右子树

我有一个BST函数,它可以在中插入数字,如下所示

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

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


非常感谢你

通常您会使用顺序树遍历算法。它从根节点开始,处理左子树,然后处理当前节点的数据,最后处理右子树

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

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

并使用它定义一个toList函数:

val toList = foldr (op ::) [] 
val toList = foldr (op ::) []