SML - 如何从树的后序扫描中创建列表

时间:2011-04-29 18:13:25

标签: list tree sml smlnj

如何在SML中实现一个获取树并返回列表的函数。该列表包含树节点中根据树的后序扫描的值。

datatype是:

datatype 'a Tree = Leaf | Branch of 'a * 'a Tree * 'a Tree;

2 个答案:

答案 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 必须完全展开其左手参数以将其添加到右侧参数中,如果您反复将其应用于更长和更长的列表,这将变得非常昂贵。相比之下,通过使用@函数将子树的后序遍历添加到传入列表中,您只需构建一次整个列表。