type BSTree a = BinaryTree a
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show
flattenTree :: BinaryTree a -> [a]
flattenTree tree = case tree of
Null -> []
Node left val right -> (flattenTree left) ++ [val] ++ (flattenTree right)
isBSTree :: (Ord a) => BinaryTree a -> Bool
isBSTree btree = case btree of
Null -> False
tree -> (flattenTree tree) == sort (flattenTree tree)
私がやりたいことは、指定されたツリーがバイナリ検索ツリーであるかどうかを判別する関数を書くことです。私の方法は、リスト内のすべての値をグループ化してインポートData.List
し、リストをソートしてそれらが等しいかどうかを見つけることですが、それは少し複雑です。他のモジュールをインポートせずにこれを行うことはできますか?
sort
、ではなくflattenTree
、これは十分に怠惰です。
flattenTree
最初に定義するつもりはありません。False
ノードがルートになっているサブツリー全体をたどる必要がなく、ノードが検索プロパティに違反している場合は、早期に戻ることができます。