木の復元
>また
>今日の一行
> 今日のはだいぶ簡単に書けたぞ。
>
>data BinT a = Node a (BinT a) (BinT a) | Leaf a deriving Show
ts [] = []
ts (x:xs) = (Leaf x, xs) : rest
where rest = do (t1, r1) <- ts xs
(t2, r2) <- ts r1
return (Node x t1 t2, r2)
data Order = PreOrder | InOrder | PostOrder
ts [] = []
ts (x:xs) = (Leaf x, xs) : rest
where rest = do (t1, r1) <- ts xs
(t2, r2) <- ts r1
return (Node x t1 t2, r2)
trees = fst . unzip . filter (null.snd) . ts >
>リストモナドを使ったときに、なんとなく勝利を予感しました。 > >……ああ、これ pre-order のトラバースしかしてないな。まあでも同じようにできるでしょう。あとでやります。 > >(追記)というわけでやってみた。 post order が超手抜き(pre は上の ts と同じ定義なので省略)。 > >import Control.Monaddata Order = PreOrder | InOrder | PostOrder
post = pre . reverse
inorder [] = []
inorder [x] = [Leaf x]
inorder l = concatMap (f . flip splitAt l) [1..length l - 2]
where f (l1, []) = []
f ([], l2) = []
f (l1, l2) = do t1 <- inorder l1
t2 <- inorder (tail l2)
return (Node (head l2) t1 t2)
trees PreOrder = fst . unzip . filter (null.snd) . pre
trees PostOrder = fst . unzip . filter (null.snd) . post
trees InOrder = inorder
>