用于遗传分类的Haskell二叉树谓词

时间:2017-11-19 16:43:30

标签: haskell tree heap binary-tree predicate

Haskell真的很新,我无法弄清楚这一点。如何检查给定二叉树中的Node是否大于其子项?

module IntTree where

data IntTree = Leaf Int
             | Node Int IntTree IntTree
             deriving (Eq,Show)

t1 :: IntTree
t1 = Node 1999 (Node 1963 (Leaf 1925)
                          (Leaf 1933))
               (Node 1956 (Leaf 1932)
                          (Leaf 1924))


t2 :: IntTree
t2 = Node 1999 (Node 1922 (Leaf 1925)
                          (Leaf 1933))
               (Node 1956 (Leaf 1932)
                          (Leaf 1924))

descendingTree :: Ord a => IntTree -> Bool

函数descendingTree将获得一个IntTree并将给我一个布尔作为回报,表明树中的每个节点是否都是该节点的值大于其两个子节点的情况'价值;如果它有孩子当然。我该怎么写这个函数?

1 个答案:

答案 0 :(得分:1)

答案是: 慢慢地 直接关注您的数据类型定义

descendingTree :: IntTree -> Bool     -- no `a`, so no `Ord a` too
-- data IntTree = Leaf Int
descendingTree   (Leaf i) = leaf i
--              | Node Int IntTree IntTree
descendingTree   (Node  i     lt     rt  ) = node i lt rt

如果它是一片叶子,则无需检查:

leaf _ = True

如果它是一个节点,总是有两个孩子;这是由其类型定义保证的。这种类型没有其他可能性。

node i lt rt = 

在这里你需要填写你的测试:

        i > value lt &&
        i > value rt &&

这两项检查将完成;如果一个失败,则整个&&表达式失败并返回False。好。如果两个测试成功怎么办?

        every_node_is_greater .... &&
        every_node_is_greater ....

你能填空吗?

你能写出every_node_is_greater的定义吗?你需要吗?

当然,leafnode这两个函数完全是多余的;他们只是在这里作为一个精神上的踩踏块,为我们删除了写作块。 :)您通常会在descendingTree定义的相应子句中编写代码。

这里需要另外写一个定义,value,我们在探索问题空间时引入的新抽象(“如果我们有办法知道”值“ “节点?我们稍后会处理具体细节......”)。现在终于要把它充实了。再次,简单地(并且慢慢地)遵循类型,并处理它呈现的案例。