如何在ML编程语言中定义多种类型的树

时间:2010-12-21 19:58:13

标签: sml ml

好吧,我被要求做下一件事:

定义一个二叉树,它可以包含两种不同的类型:('a,'b)abtree,这些是要求:

  1. 任何内部顶点(不是叶子)必须是“a”或“b”类型且叶子没有值。
  2. 对于树中的每个路径,所有值都必须出现在'b值之前:路径示例:

    'a->'a->'a-'b (legal)
    'a->'b->'b (legal)
    'a->'a->'a (legal)
    'b->'b->'b (legal)
    'a->'b->'a (ILLEGAL)
    
  3. 并且我还需要定义另一棵树,就像上面描述的那样,但现在我也得到了'c并且在第二个要求中它表示对于每个路径我'值出现在'b值和所有之前'b值出现在'c值。

    之前

    首先,我不确定如何定义二进制树,其中包含多个类型。 我的意思是最简单的二叉树是:

    datatype 'a tree =
              leaf
             | br of 'a * 'a tree * 'a tree;
    

    还有我如何定义树来满足这些要求。

    任何帮助将不胜感激。

    感谢。


    好的,非常感谢。所以你的意思是这样的:

    datatype 'b bTree = 
              leaf
            | bBranch of 'b * 'b bTree * 'b bTree
    ;
    datatype ('a,'b) abTree = 
              leaf
            | aBranch of 'a * ('a, 'b) abTree * ('a,'b) abTree
            | bBranch of 'b * 'b bTree * 'b bTree
    ;
    

    这就是我为这个案例所做的,就像我上面提到的那样,它是一个3型树:

    datatype 'c cTree =  
        leaf
        | cBranch of 'c * 'c cTree * 'c cTree
    ;
    
    
    datatype ('b, 'c) bcTree = 
                leaf
        | bBranch of 'b * ('b, 'c) bcTree * ('b,'c) bcTree
        | cBranch of 'c * 'c cTree * 'c cTree
    
    ;
    
    datatype ('a, 'b, 'c) abcTree = 
        leaf
                | aBranch of 'a * ('a, 'b, 'c) abcTree * ('a, 'b, 'c) abcTree
                | bBranch of 'b * ('b, 'c) bcTree * ('b, 'c) bcTree
        | cBranch of 'c * 'c cTree * 'c cTree
    ;
    

    我是对的吗?

    另外,叶子的要求是什么意思?那说叶子应该没有价值的那个?

1 个答案:

答案 0 :(得分:3)

  

首先,我不确定如何定义二进制树,其中包含多个类型。

datatype ('a, 'b) twotypetree = ...
  

还有我如何定义树来满足这些要求。

twotypetree定义为包含abranch值的'a和两个('a, 'b) twotypetree s或包含'b tree的bbranch。

由于'b tree不能包含任何'a,因此bnode不能包含任何包含'a的子节点,因此符合要求。