【问题标题】:SML - How to create a list out of a postorder scan of a treeSML - 如何从树的后序扫描中创建列表
【发布时间】:2011-08-15 16:43:10
【问题描述】:

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

datatype 的树是:

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

【问题讨论】:

    标签: list tree sml smlnj


    【解决方案1】:

    更有效的解决方案:

    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 函数将子树的后序遍历添加到传入的列表中,您可以只构建整个列表一次。

    【讨论】:

      【解决方案2】:

      这可以通过以下方式完成:

       fun createList(Leaf) = []
      =   | createList(Branch(el, left, right)) = createList(left) @ createList(right) @ [el];
      

      如果你有一个分支首先访问它的左子树(createList(left)),然后是右子树(createList(right)),然后附加元素el,所以基本上做后序树遍历所做的事情。如果您想从 Leaf(一棵空树)创建一个列表,结果将是一个空列表。

      【讨论】:

      • 谢谢,我的语法有问题......你的解决方案帮助了我:)
      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多