2016-06-11 6 views
0

これが私のGuidlineです:印刷アウトバイナリツリーを

data BinTree α = Empty 
    | Node (BinTree α) α (BinTree α) 
    deriving (Eq, Show) 

は、今私は、関数を作成したい:

levels :: BinTree a -> [[a]] 

これは、リスト内のバイナリツリーをプリントアウトしますが、各レベルの必要がありますそれ自身。例えば:... [[1],[2,3],[4,5,6,7]]又は

[1] 
[2,3] 
[4,5,6,7] 

Iはrootschilds定義:

roots ts = [ a | Node _ a _ <- ts ] 
childs ts = [ t | Node l _ r <- ts, t <- [l, r] ] 

とサブツリーとそのノードのリストを取得し、トラバース機能。

traverse' :: [BinTree α] -> [α] 
traverse' [] = [] 
traverse' ts = roots ts ++ traverse' (childs ts) 

levels :: BinTree α -> [α] 
levels t = traverse [t] 

しかし、それは私が本当に望んでいたものではありません。誰かがアイデアを持っていますか?

+0

バイナリツリーをリストのリストに変換する 'f :: BinTree a - > [[a]]'を書いてみてください。最初のリストにはルートが含まれ、2番目のリストには子孫、次の孫等々。それ以降はほぼ完了です。 – ThreeFx

+0

それ以外の場合は[this](http://stackoverflow.com/questions/12556469/nicely-printing-showing-a-binary-tree-in-haskell?rq=1)の質問をご覧ください。関数。 – ThreeFx

+0

左と右の子ノードのレベルに関してノードのレベルを表現する方法について考えてみましょう。 'zip'関数について紹介しましたか? – ErikR

答えて

1

これは正常に動作します:

f Empty = [] 
f (Node l v r) = case (f l, f r) of 
        ((x:xs),(y:ys)) -> [[v],x++y] ++ (zipWith (++) xs ys) 
        ([],[])   -> [[v]] 
        ...... 

は、パターンを完了します。 (これを完全なツリーでテストして、それが良いスタートであることを確認することができます)。