我有BST功能,插入数字就像这样
val t =节点(节点(空,10,空),20,节点(空,30,空)):BST
如何编写一个接受val t的函数并返回BST中的顺序列表,如[10,20,30]
非常感谢你!
答案 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 ::) []