私は重く
data Tree a = Node (Tree a) a (Tree a)
| Leaf a
deriving (...)
にTree
を変更することはお勧めし、私の答えでこれを使用しますが、あなたのTree
にそれを変換することはどこでもa ~ Int
を設定し、Tree
でTree Int
を交換するのと同じくらい簡単です。
各レイヤーの要素のリストを作成し、それらのすべてが並べ替えられていることを確認します。葉が無限に多くの空のレベル
leafCase x = [x] : repeat []
そして続いレベルでの単一の要素があるよう
foldTree :: (a -> b) -> -- Leaf case
(b -> a -> b -> b) -> -- Node case
Tree a -> b
葉は、repeat []
続いシングルトンリストを含むリストを作成あなたが機能を持っていると仮定すると、
nodeCase l x r = [x] : zipWith (++) l r
フォールtを:また、上にシングルトンリストにその要素を配置しながら内部ノードは、サブツリーリストサブリストのペアごとを連結します彼以上のレベルのリストを取得し、最後の空でないものの後にそれを遮断するTree
:各レベルがソートされていることを
levels = takeWhile (not . null) . foldTree leafCase nodeCase
はチェック:
sorted = all (uncurry (<=)) . (zip <*> tail)
一つの機能
にそれをすべてをミックスし
recursion-schemes
と
sortedTree = all sorted . takeWhile (not . null) . levels
where sorted = all (uncurry (<=)) . (zip <*> tail)
levels = foldTree (\l -> [l] : repeat []) (\l x r -> [x] : zipWith (++) l r)
同じこと:
makeBaseFunctor ''Tree
-- data TreeF a b = NodeF b a b | LeafF a
-- ...
levelsSorted :: (Recursive t, Foldable (Base t), Ord a) => (Base t [[a]] -> a) -> t -> Bool
levelsSorted get = all sorted . takeWhile (not . null) . levels
where sorted = all (uncurry (<=)) . (zip <*> tail)
levels = cata $ \x -> [get x] : foldr (zipWith (++)) (repeat []) x
levelsSortedTree :: Ord a => Tree a -> Bool
levelsSortedTree = levelsSorted $ \case { LeafF _ x _ -> x; NodeF x -> x }
あなたは何を試しましたか? –
木がBSTであるかどうかをチェックしたいと思うような音がします。 – RoadRunner
@RoadRunner、いいえ、彼はそうではありません、ツリーの例はBSTではなく、まだ通ります。 – HTNW