验证二进制搜索树-Haskell初学者

验证二进制搜索树-Haskell初学者,haskell,tree,Haskell,Tree,所以本质上我想从一个节点开始,它必须大于左子树,但小于右子树。。。等等在我的工作表上写着把它分成两个函数,让它更简单。使用“也许a”。(它无法将'maybea'类型与'a'类型匹配,这完全阻止了我 这就是我所拥有的,我看到一个类似的问题被问到,但我不能真正理解它。提前谢谢 is_valid_binary_search_tree :: Ord a => BSTree a -> Bool is_valid_binary_search_tree tree = case tree of

所以本质上我想从一个节点开始,它必须大于左子树,但小于右子树。。。等等在我的工作表上写着把它分成两个函数,让它更简单。使用“也许a”。(它无法将'maybea'类型与'a'类型匹配,这完全阻止了我

这就是我所拥有的,我看到一个类似的问题被问到,但我不能真正理解它。提前谢谢

is_valid_binary_search_tree :: Ord a => BSTree a -> Bool
is_valid_binary_search_tree tree = case tree of 
    Null                               -> True
    Node element t1 t2
        | element > get_element t1 -> is_valid_binary_search_tree t1
        | element < get_element t2 -> is_valid_binary_search_tree t2
        | otherwise                -> False 

get_element :: BSTree a -> Maybe a
get_element tree = case tree of
    Null               -> Nothing
    Node element t1 t2 -> Just element
是否有效\u二进制\u搜索\u树::Ord a=>b树a->Bool
有效吗?二进制搜索树=案例树
空->真
节点元素t1 t2
|元素>获取元素t1->是有效的二叉搜索树t1吗
|元素是有效的二叉搜索树t2吗
|否则->错误
获取元素::b树a->可能是a
get_元素树=案例树
空->无
节点元素t1 t2->仅元素
它可以编译,但如果我删除Null->Nothing,它会在get_元素中以详尽的模式显示。
如果子树的右子树小于主节点,则is\u valid\u binary\u search\u树也不会进行比较。(这确实是我的大问题)

所述解决方案的问题在于,仅检查当前树元素是否大于左,是否分别小于右子元素是不够的。 例如,以下不是有效的二叉树:

Node 3 (Node 1 (Node 0 Null Null) (Node 2 Null Null)) 
       (Node 10 (Node (-1) Null Null) (Node 12 Null Null))
实际上有一个简单的解决方案: 按顺序遍历树(即将其转换为列表),然后检查列表是否为升序:

inOrder Null = [] 
inOrder (Node a t1 t2) = inOrder t1 ++ [a] ++ inOrder t2

我根据彼得的回答提供了一个有效的解决方案

inOrder :: Tree a -> [a]
inOrder Nil = []
inOrder (Node y l r) = inOrder l ++ [y] ++ inOrder r

isAscending :: [Int] -> Bool
isAscending [x] = True
isAscending (x:xs) = x <= head (xs) && isAscending xs

is_valid_binary_search_tree :: Tree Int -> Bool
is_valid_binary_search_tree = isAscending . inOrder
<代码>索引::树a->[a] 顺序为Nil=[] 顺序(节点y l r)=顺序l++[y]++inOrder isAscending::[Int]->Bool IsAscing[x]=真 isAscending(x:xs)=x布尔 _有效_binary_search_tree=isAscending.inoder吗
谢谢,我把它们放在一起,得到了它。我决定在这个过程中编写一个Bool is_顺序函数,并注意到它要递归地检查它是否是升序的,它不接受
x:xs=x@HerrSchlachter:
x
具有类型
a
,而
是有序的xs
具有类型
Bool
nse将它们与