用ML填充ML中的普通二叉树

时间:2011-02-17 02:44:45

标签: sml

让我们说:

datatype bin_tree = Empty |
                    Node of value * bin_tree * bin_tree

我如何填写二叉树(不是二进制搜索树,左边小于根,右边更大)。只是在二叉树中每个节点插入的列表中的值。

3 个答案:

答案 0 :(得分:4)

您使用已声明的值构造函数。

如果我们暂时假定valueint,那么我们就会知道树

     1
    / \
   2   4
  /
 3

表示为:

Node (1,
    Node (2,
        Node (3, Empty, Empty),
        Empty
    ),
    Node (4, Empty, Empty)
)

或者,相当于一行:

Node (1, Node (2, Node (3, Empty, Empty), Empty), Node (4, Empty, Empty))

答案 1 :(得分:1)

如果不了解您如何从给定列表中构建树,那么实际上无法帮助您。但是,这是一个创建平衡树的示例。它接受第一个元素并将其用作节点值,然后将列表的其余部分拆分为两个大小相等的子列表(如果可能),方法是将“left”列表中的所有“even”元素和所有“ “右”列表中的奇数“元素:

datatype 'a bin_tree = Empty
                  | Node of 'a * 'a bin_tree * 'a bin_tree

fun list_split xs =
    let
      fun loop [] (left, right) = (rev left, rev right)
        | loop (x::y::xs) (left, right) = loop xs (x :: left, y :: right)
        | loop (x :: xs) (left, right) = loop xs (x :: left, right)
    in
      loop xs ([], [])
    end

fun built_tree [] = Empty
  | built_tree (x :: xs)  =
    let
      val (left, right) = list_split xs
      val left_tree = built_tree left
      val right_tree = built_tree right
    in
      Node (x, left_tree, right_tree)
    end

结果:

- built_tree [1,2,3,4,5,6,7,8,9];
val it =
  Node
    (1,Node (2,Node (4,Node (8,Empty,Empty),Empty),Node (6,Empty,Empty)),
     Node (3,Node (5,Node (9,Empty,Empty),Empty),Node (7,Empty,Empty)))
  : int bin_tree

答案 2 :(得分:-2)

Here is an answer用Java完成的同样问题。这可能会有所帮助:)。