2011-02-17 105 views
0

如果讓我們說填補了正常的二叉樹ML:與價值觀

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

我將如何去填充一個二叉樹(不是二叉搜索樹,其中左邊是比根小右大)。只是插入到二叉樹中每個節點的列表中的值。

+0

塞巴斯蒂安給了一個很好的例子,下面,爲如何構建一個特定的樹,然而,構建從這樣的`bin_tree`任何整數列表都要求您給出一個算法或解釋,說明如何構建樹。 – 2011-10-30 18:13:35

回答

-2

Here is an answer在Java中完成相同的問題。這可能會有所幫助:)。

+2

我很抱歉地說,但你不能再從 的真相中得到進一步的瞭解。這個答案是(完全)無用的,特別是在這個 上下文中。 – 2011-10-30 18:49:01

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

這不是真的可能t o幫助你,而不知道你如何從給定的列表中構建你的樹。但是,這是一個創建平衡樹的例子。它採用第一個元素並將其用作節點值,然後通過將「左」列表中的所有「偶」元素以及所有「右‘名單奇」中的元素’:

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