2013-10-02 20 views
0

我是F#的新手,想知道如何將簡單整數列表轉換爲樹。將整數列表轉換爲F中的樹#

let lst =[1;2;3;4] 
type Tree= 
|Leaf of int 
|Node Tree * Tree 

列表應該轉換成樹這樣的--->葉1,節點(葉2),節點(節點(葉3,葉4))

+1

到底是什麼,你想要得到的結果?你想獲得一棵平衡的樹嗎? –

+1

我同意托馬斯 - 很難說出你希望輸出什麼樣的樹。如果這是家庭作業,那麼也許你應該分享你已經嘗試過的東西。 –

回答

2

要得到的輸出你的答案有點不好格式化,但我的解釋是你正試圖建立一個平衡的二叉樹。要遞歸執行此操作,需要將輸入列表分爲兩半,然後從左側和右側遞歸構建樹。

這有點棘手,因爲將功能列表分成兩半並不那麼簡單。在實踐中,你很可能把你的數據到一個數組和使用,但如果你想有一個實用的解決方案,你可以使用:

type Tree = Leaf of int | Node of Tree * Tree 

let rec half marker acc xs = 
    match xs, marker with 
    | x::xs, _::_::marker -> half marker (x::acc) xs 
    | x::xs, _::[] -> List.rev (x::acc), xs 
    | xs, _ -> List.rev acc, xs 

half功能巧妙之處在於它遍歷列表,並有兩隻清單的副本。從一個(稱爲)開始,每個步驟都需要兩個元素,所以當這個列表爲空時,您已經到達原始列表的中間位置,每個步驟只有一個元素。

現在你可以寫一個簡單的遞歸函數來構建樹

let rec makeTree = function 
    | [] -> failwith "Does not work on empty lists" 
    | [x] -> Leaf x 
    | xs -> let l, r = half xs [] xs 
      Node(makeTree l, makeTree r) 
+0

感謝Tomas,我嘗試了使用for循環的很少的方法,但不成功。 – ldmohan