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
并将给我一个布尔作为回报,表明树中的每个节点是否都是该节点的值大于其两个子节点的情况'价值;如果它有孩子当然。我该怎么写这个函数?
答案 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
的定义吗?你需要吗?
当然,leaf
和node
这两个函数完全是多余的;他们只是在这里作为一个精神上的踩踏块,为我们删除了写作块。 :)您通常会在descendingTree
定义的相应子句中编写代码。
这里需要另外写一个定义,value
,我们在探索问题空间时引入的新抽象(“如果我们有办法知道”值“ “节点?我们稍后会处理具体细节......”)。现在终于要把它充实了。再次,简单地(并且慢慢地)遵循类型,并处理它呈现的案例。