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
如果节点违反了搜索属性,则可以尽早返回,而不必遍历以该节点为根的整个子树。