我嘗試總結所有路徑,儘管樹是從根到最低的子節點之間的每個級別擴展1到10次。 我的函數對所有孩子都進行遞歸遞歸,但是我遇到這樣的問題,當我嘗試創建節點列表並在列表中執行此列表時,我將成爲列表的列表列表...列表。 我認爲我的問題是組合步驟而我試圖做一個模式匹配方法,但應該比較列表,當它成爲列表的列表的方法,並應該做出新的列表,並比較它們,如果它只是一種方式(符合與節點列表而不是列表與列表)不起作用。Haskell總結了樹中的所有路徑
回答
summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
t <- [t1, t2]
map (a:) (summarize t)
編輯:請注意,上述承擔Tree
定義如下:
data Tree a = Leaf | Node a (Tree a) (Tree a)
編輯#2:此代碼的版本可能更清楚:
summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
t <- [t1, t2]
summary <- summarize t
return (a:summary)
這個版本有它可以寫作列表理解的好的屬性:
summarize (Node a t1 t2) = [a:summary | t <- [t1, t2], summary <- summarize t]
我*喜歡*這個答案。 –
@rightfold雖然這不相同。您的版本將最終結果包裝在「返回」中。 –
@GabrielGonzalez哎呀,brainfart。下次應該多加註意。 :) – 2013-07-06 19:18:35
樹可以表示爲列表 - 一元列表(列表中有幾個選項可以在每個點恢復)。那麼,你想要的只是這個單子列表上的一個摺疊。
import Control.Monad.Trans.List.Funcs (repeatM) -- cabal install List
import qualified Data.List.Class as L
exampleTree = L.take 3 (repeatM [0, 1])
要查看所有路徑:
ghci> L.toList exampleTree
[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
綜上所述所有路徑:
ghci> L.foldlL (+) 0 exampleTree
[0,1,1,2,1,2,2,3]
WRT的樹木這個表示,該ListTree包提供了樹操作組合程序(如DFS/BFS迭代)表示爲ListT []
s。
- 1. 樹 - 路徑總和
- 2. 查找二叉樹中所有等於總和的路徑
- 3. 查找樹結構中的所有唯一路徑
- 4. 在樹狀結構中獲取所有可能的路徑
- 5. 樹中最高總和的路徑
- 6. Haskell IO總結所有輸入
- 7. 打印所有路徑的二叉樹
- 8. 樹形結構的路徑樹
- 9. 二叉樹中所有節點的深度總和(路徑長度)
- 10. 樹路徑樹
- 11. Neo4j總結路徑中的節點值
- 12. Haskell:返回一個多路樹的所有葉子?
- 13. 二叉樹路徑總和(python)
- 14. 表總結的Haskell
- 15. 給定二進制樹打印所有導致給定總和的路徑
- 16. Python(yield):樹中從葉到根的所有路徑
- 17. 獲取DOM樹中所有根到葉路徑的列表
- 18. 樹形結構上的引用路徑
- 19. 嘗試實現Haskell二叉樹搜索的路徑記錄
- 20. 總是有一些MST是最短路徑樹嗎?
- 21. SQL樹形路徑結構長度
- 22. 路徑數據像數據結構樹
- 23. 找到來自xgboost.dump的二叉樹的所有路徑
- 24. Cypher:沒有環路的所有路徑
- 25. 查找路徑中的所有文件,除了文件
- 26. 總結Haskell的輸出線
- 27. 記錄在二叉樹數據的所有路徑
- 28. 打印二叉樹(DFS)的所有路徑
- 29. 查找從樹根到葉子的所有路徑在方案
- 30. 如何使用Javascript獲取樹葉的所有路徑?
你的(非工作)代碼可能會使你所嘗試的更清晰:-) – gspr