2014-02-24 98 views
1

對於一個作業,我做了在Haskell二叉樹實現這樣:哈斯克爾非二叉樹

data BinTree = L | N BinTree BinTree deriving (Eq, Show) 

-- this function creates the full binary tree of size 2^(n+1) -1 
makeBinTree 0 = L 
makeBinTree n = N (makeBinTree (n-1)) (makeBinTree (n-1)) 

它創建了一個二叉樹,其中每個父節點有兩個孩子。所以,makeBinTree 3有以下輸出:N(N(NLL)(NLL))(N(NLL)(NLL))

爲了我自己的理解,我希望做一棵樹,使每個父節點有任意數量的孩子。我一直堅持如何繼續。

所以輸入將是:

makeBinTree 2 3

和輸出將是:

N(NLLL)(NLLL)(NLLL)

的任何提示如何這將不勝感激。

+5

你將需要進行新的數據類型。如果你想要一個任意數字,這意味着你想要0或更多。什麼常見的數據結構包含0個或更多元素? – bheklilr

+0

'數據BinTree = L | N BinTree BinTree'有2個分支。數據BinTree = L | N BinTree BinTree BinTree'有3個分支。但是如果你想要一棵可以有多個分支的樹呢?這兩個定義之間保持一致以及哪些變化? – bheklilr

回答

1

你可以像下面的代碼那樣做,你必須用逆波蘭符號指定樹,數字是你創建的樹的奇偶性。

如果樹嘗試採用大於樹列表中樹數的樹數,程序就會崩潰。

如果創建的最後一棵樹不採用樹列表中的所有樹,該程序會生成多棵樹。

data Tree = Branch [Tree] deriving Show 

make :: [Int] -> [Tree] -> [Tree] 
make [] l2 = l2 
make (i1 : l1) l2 = make l1 (Branch (take i1 l2) : drop i1 l2) 

例子:

make [0, 0, 2, 0, 2] [] = [Branch [Branch [], Branch [Branch [], Branch []]]]