【发布时间】:2011-08-15 16:43:10
【问题描述】:
如何在 SML 中实现一个获取树并返回列表的函数。该列表根据树的后序扫描由树节点中的值组成。
datatype 的树是:
datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;
【问题讨论】:
如何在 SML 中实现一个获取树并返回列表的函数。该列表根据树的后序扫描由树节点中的值组成。
datatype 的树是:
datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;
【问题讨论】:
更有效的解决方案:
local
fun helper Leaf result = result
| helper (Branch (el, left, right)) result = helper left (helper right (el::result))
in
fun createList tree = helper tree nil
end
这更有效,因为@ 必须完全展开其左侧参数以将其添加到右侧参数,如果您反复将其应用于越来越长的列表,这将变得非常昂贵。相比之下,通过使用 helper 函数将子树的后序遍历添加到传入的列表中,您可以只构建整个列表一次。
【讨论】:
这可以通过以下方式完成:
fun createList(Leaf) = []
= | createList(Branch(el, left, right)) = createList(left) @ createList(right) @ [el];
如果你有一个分支首先访问它的左子树(createList(left)),然后是右子树(createList(right)),然后附加元素el,所以基本上做后序树遍历所做的事情。如果您想从 Leaf(一棵空树)创建一个列表,结果将是一个空列表。
【讨论】: