如何在SML中实现一个获取树并返回列表的函数。该列表包含树节点中根据树的后序扫描的值。
树datatype
是:
datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;
答案 0 :(得分:2)
这可以通过以下方式完成:
fun createList(Leaf) = []
= | createList(Branch(el, left, right)) = createList(left) @ createList(right) @ [el];
如果你有一个分支第一次访问它的左子树(createList(left)
),那么它是正确的子树(createList(right)
),然后追加元素el
,所以基本上做了一个postorder树遍历确实如此。如果要从Leaf
(空树)创建列表,结果将是一个空列表。
答案 1 :(得分:0)
更有效的解决方案:
select count ( distinct item ) as item_count
, count ( document ) as doc_count
from tabl1
;
这更有效,因为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
必须完全展开其左手参数以将其添加到右侧参数中,如果您反复将其应用于更长和更长的列表,这将变得非常昂贵。相比之下,通过使用@
函数将子树的后序遍历添加到传入列表中,您只需构建一次整个列表。