2015-01-17 24 views
0

我有這個功能,我寫了從樹傳遞給一個列表在Haskell:TreeToList在Haskell功能

treeToList :: Tree -> [Int] 
treeToList (Leaf x) = [x] 
treeToList (Node left x right) = treeToList left ++ [x] ++ treeToList right 

這一切正常,但是我有一個疑問:

與輸入:

treeToList (Node (Leaf 1) 2 (Node (Leaf 3) 4 (Leaf 5))) 

的函數產生該列表:

[1,2,3,4,5] 

其中,我認爲是錯誤的,因爲如果我想以相反的方式,並從列表中寫出樹,我會寫錯了。

我該如何解決這個問題?

+0

「寫錯了」的含義並不明顯。我們可以通過很多方式將列表變成樹(同時保持元素的順序)。另外,如果你想「走另一條路」,你將不得不寫一個完全不同的函數,所以我不明白爲什麼這個'treeToList'與此相關。 –

+0

這是不可能的:任何樹訪問(前,後,後)都定義了從樹到列表的非內射映射,因此信息丟失。在韌皮中,您可以實現僞逆,即重建曾經訪問過的許多樹中的一棵,並將輸入列表返回。 – chi

+0

@AndrásKovács所以這是一個將樹轉換爲列表的正確方法? – laker001

回答

1

這是通過「按順序」遍歷將二叉樹Int轉換爲列表的正確方法。這是將搜索樹變成列表的最常見方式。然而,還有其他有效的方法來遍歷樹,這些樹會根據各種目的以不同的順序生成列表,正如您在Wikipedia上看到的那樣。正如AndrásKovács和chi指出的那樣,除非你有關於你想構建的樹形狀的具體信息,否則通常沒有辦法倒退。