haskell中树的最大元素?

时间:2017-12-17 17:11:02

标签: haskell data-structures tree

给出一棵树:

data Tree a = Empty | Node a [Tree a] deriving Show

我正在尝试获取最大元素,所以我尝试过:

maxElem:: (Ord a) => Tree a -> Int
maxElem Empty = error "maxElem on empty Tree"
maxElem (Node a []) = a
maxElem (Node a x ) = maximum [ maxElem h | h<-x]

但我收到错误而我找不到。

1 个答案:

答案 0 :(得分:5)

这里有三个潜在的问题:

  1. 如果树包含一个或多个Empty s,则会出错。因此,Node 1 [Node 4 [], Empty, Node 2 [Node 5 []]]会引发错误,因为树中有Empty,我们最终会在maxElem上调用Empty,而我们可以忽略Empty因此返回5;
  2. 当您计算带有孩子的a的最大值时,您也不会考虑Node,而a也可能是最大值;
  3. 结果也是a,而不是Int
  4. 实际上有两种情况:  1. Empty树,会引发错误;和  2. Node x cs的最大值是x和孩子的maxElem的最大值,忽略Empty s

    所以我们可以把它写成:

    maxElem:: Ord a => Tree a -> a
    maxElem Empty = error "maxElem on Empty"
    maxElem (Node x cs) = maximum (x : map maxElem [c | c@(Node _ _) <- cs])

    或者我们可以在列表理解中编写map maxElem

    maxElem:: Ord a => Tree a -> a
    maxElem Empty = error "maxElem on Empty"
    maxElem (Node x cs) = maximum (x : [maxElem c | c@(Node _ _) <- cs])

    所以基本情况相同,但Node x cs的情况计算列表的maximum,其中x为首,map MaxElem为尾,但不是在所有子项上,但仅限于与Node _ _模式匹配的子项。由于此列表包含至少一个元素xmaximum在空列表中可能错误,因此我们仅在maxElem个实例上计算Node