【问题标题】:2D Binary Tree in SMLSML 中的二维二叉树
【发布时间】:2014-12-05 01:56:46
【问题描述】:

我很难弄清楚如何使用 sml 实现二维二叉树

这是我到目前为止所拥有的,但我得到了一个 tycon 不匹配。

datatype btree =
                 Empty |
                 Node of int * btree * btree;


fun AddNode (i:int, Empty) = Node(i, Empty, Empty) | 
    AddNode(i:int, Node(j, left, right)) = 
        if i = j then Node(i, left, right) 
        else if i < j then Node(j, AddNode(i, left), right)
        else Node(j, left, AddNode(i, right)); 

fun printInorder Empty = () | 
    printInorder (Node(i,left,right)) =
            (printInorder left; print(Int.toString i ^ " "); printInorder right);

datatype twotree =
                Empty |
                Node of int * twotree * twotree * btree;

fun Add2Node(int:i, int:j, Empty) = Node(i, btree, Empty, Empty) |
    Add2Node(int:i, int:j, Node(k, btree, left, right)) =
        if i = k then Node(i, Addnode(j, root), left, right)
        else if i < k then Node(k, root, Add2Node(i, j, left), right)
        else Node(k, root, left, Add2Node(i, j, right));

val x : btree = AddNode(50, Empty);
val x : btree = AddNode(75, x);
val x : btree = AddNode(25, x);

printInorder(x);

val 最初是为了测试二叉树的第一部分,但一旦我尝试执行 2d 部分,它会与原始 AddNode 产生错误

【问题讨论】:

  • 您知道Empty 已经是List 结构中的异常名称吗? sml-family.org/Basis/list.html#SIG:LIST.Empty:EXN 另外,为什么你的AddNode 只接受btreeEmpty 而不是任何btree
  • 我是 SML 的新手,我可以轻松地用 c++ 或 java 对其进行编程。我只是在从 OOP 过渡到函数式编程时遇到了麻烦@benruudgers
  • 你在哪里定义了Emptynode 在哪里定义?你遇到了什么错误?重现它所需的最少代码是多少?
  • 跳出来的东西:btree 不是一个值,它是一个类型。 root 这个名字神奇地突然出现。另外,我会避免重用类型构造函数的名称。它变得非常混乱。

标签: 2d binary-tree sml smlnj


【解决方案1】:

我想,您可能只使用btree 数据类型来实现二维二叉树。无需定义twotree。 您只需要实现 Add2Node 函数,通过比较相互递归调用中的 y 坐标或 x 坐标,将 2d 点插入到您的 btree 中:

fun Add2Node (y, x, tree) = insertY (y, x, tree)

and insertY (y, x, Empty) = Node (y, insertX (y, x, Empty), Empty) 
  | insertY (y, x, Node (k, left, right)) = 
    if y < k then 
      Node (k, insertX (y, x, left), right)
    else
      Node (k, left, insertX (y, x, right))

and insertX (y, x, Empty) = Node (x, Empty, Empty) 
  | insertX (y, x, Node (k, left, right)) =
    if x < k then
      Node (k, insertY (y, x, left), right)
    else
      Node (k, left, insertY (y, x, right))

给定的代码可以编译,但没有经过测试。您的 Add2Node 代码不会根据一些拼写错误进行编译(例如:类型注释必须放在变量后面,而不是像在 C++ 和 Java 中那样放在变量之前)。此外,您在模式匹配位置使用 btree 数据类型。要使其编译,您必须在此处使用数据类型的构造函数之一 EmptyNode

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2015-04-07
    • 2011-06-28
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多