【问题标题】:Insert element into a tree from a list in Standard ML从标准 ML 的列表中将元素插入树中
【发布时间】:2011-01-26 19:26:04
【问题描述】:

我刚开始自学 SML,遇到了教程中的一个问题。 假设我有:

树数据类型

datatype node of (tree*int*tree) | null

插入函数

fun insert (newItem, null) = node (null, newItem, null)
|   insert (newItem, node (left, oldItem, right)) =                               
    if (newItem <= oldItem) then node (insert(newItem,left),oldItem, right)
                            else
                                 node (left, oldItem, insert(newItem, right)

一个整数列表

val intList  = [19,23,21,100,2];

我的问题是如何添加一个函数来遍历列表中的每个元素并添加到树中?

非常感谢您的回答。

【问题讨论】:

    标签: list tree sml ml


    【解决方案1】:

    使用 foldl 和 insert 作为折叠函数,一棵空树作为起始值。

    对于列表中的每个项目,foldl 将调用 insert,并将项目和目前创建的树作为参数。然后,insert 调用的结果将在下一次 insert 调用中用于列表中的下一个项目,依此类推。

    另请注意,问题中树类型和插入函数的定义被破坏:首先,您没有给类型命名(语法是datatype name = Foo | Bar,而不是datatype Foo | Bar)。其次,构造函数名称必须以大写字母开头。所以类型定义需要是datatype tree = Node of (tree*int*tree) | Null,并且在插入函数中你必须用“Node”和“Null”替换每次出现的“node”和“null”。

    【讨论】:

    • 一棵空树的值是多少?我试过类似:foldl insert node(null, 0, null) list1 假设 list1 = [1,30,1,2,4];用 Null 代替 null,用 Node 代替 node 也是一个很好的约定吗?
    • @vichet:空树为 Null。
    • @vichet:使用 Null 而不是 null 与约定无关。一个有效,另一个无效。
    猜你喜欢
    • 2020-05-12
    • 2015-04-05
    • 2012-04-14
    • 2013-08-19
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2017-11-30
    相关资源
    最近更新 更多