木の復元

This entry was posted by on Thursday, 16 March, 2006
>また >今日の一行 > 今日のはだいぶ簡単に書けたぞ。 > >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)

trees = fst . unzip . filter (null.snd) . ts > >リストモナドを使ったときに、なんとなく勝利を予感しました。 > >……ああ、これ pre-order のトラバースしかしてないな。まあでも同じようにできるでしょう。あとでやります。 > >(追記)というわけでやってみた。 post order が超手抜き(pre は上の ts と同じ定義なので省略)。 > >import Control.Monad
data 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 > >うっかりリストモナドを使ってますが、ふつうはやっぱり内包表記なのでしょうか。内包表記ってあんまり使ったことないなあ。 >

Comments are closed.