haskell中树的最大元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haskell中树的最大元素?相关的知识,希望对你有一定的参考价值。

鉴于一棵树:

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. 如果一棵树包含一个或多个Emptys,它将会出错。因此,Node 1 [Node 4 [], Empty, Node 2 [Node 5 []]]会引起错误,因为树中有一个Empty,我们最终会在maxElem上调用Empty,而我们可以忽略Empty,从而返回5;
  2. 当你计算有孩子的a的最大值时,你也不考虑Node,而a也是最大的;
  3. 结果是a,本身不是Int

实际上有两种情况:1。Empty树,它引起错误; 2. Node x cs的最大值是x和孩子们的maxElem的最大值,忽略了Emptys。

所以我们可以把它写成:

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的情况计算列表的maximumx作为头,map MaxElem作为尾,但不是所有的孩子,但只有匹配Node _ _模式的孩子。由于此列表包含至少一个元素xmaximum不能在空列表中出错,并且我们仅在maxElem实例上计算Node

以上是关于haskell中树的最大元素?的主要内容,如果未能解决你的问题,请参考以下文章

正确性证明:图论中树的直径算法

数据结构中树的计数

Python中树的中序遍历返回列表

一文了解树在前端中的应用,掌握数据结构中树的生命线

981统计利用二叉树存储的森林中树的棵数

Java中树和树的几种常规遍历方法