SML中的二维二叉树

时间:2014-10-10 00:46:40

标签: 2d binary-tree sml smlnj

我很难搞清楚如何使用sml实现2d二叉树

这是我到目前为止所得到的但是我得到了一个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创建了一个错误

1 个答案:

答案 0 :(得分:0)

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

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)) 代码不会根据某些拼写错误进行编译(例如:类型注释必须放在变量之后,而不是像C ++和Java之前那样)。此外,您在模式匹配位置使用Add2Node数据类型。要进行编译,您必须在此处使用数据类型的构造函数btreeEmpty之一。