在Haskell中,如何返回二叉树中的节点数?

在Haskell中,如何返回二叉树中的节点数?,haskell,recursion,Haskell,Recursion,对于二叉树类型的树,定义一个返回节点数的函数。我提出了这个函数,但它没有运行 错误:不在范围内:数据构造函数“节点” numberOfNodes :: Tree -> Int numberOfNodes Null = 0 numberOfNodes (Node _ st1 st2) = 1 + max (st1)(st2) 似乎在范围中没有数据类型定义。应该是的 data Tree a = Null | Node a (Tree a) (Tree a) 此外,您显示的代码计算树的深度&

对于二叉树类型的树,定义一个返回节点数的函数。我提出了这个函数,但它没有运行

错误:不在范围内:数据构造函数“节点”

numberOfNodes :: Tree -> Int
numberOfNodes Null = 0
numberOfNodes (Node _ st1 st2) = 1 + max (st1)(st2)

似乎在范围中没有数据类型定义。应该是的

data Tree a = Null | Node a (Tree a) (Tree a)
此外,您显示的代码计算树的深度 (原则上,在修复之后)。树的节点总数是其左、右子树中的节点数之和,给定或取1;不是马克斯


空(叶,
Null
)节点可能不应计数,即它们对总计数的贡献可能为0。你自己决定。

第一个问题是,你似乎缺少一个树的定义

通常我们说它要么是一个有一个值加上两个子树的节点,要么是空的

接下来,我们对(非空)树中节点数的递归定义应该是:

左子树中的节点数
+
右子树中的节点数
+1

以下是完整的定义:

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show)
numberOfNodes :: Tree x -> Int
numberOfNodes Empty = 0
numberOfNodes (Node _ st1 st2) = 1 + numberOfNodes(st1) + numberOfNodes(st2)
(注意,我们实现了
Show
typeclass,以便打印树)

如果我们定义一个具有3个节点的二叉树,请参见其工作原理:

myTree :: Tree Int
myTree =
   Node 0
      (Node 1 Empty Empty)
      (Node 2 Empty Empty)
>numberOfNodes我的树

=>3


该错误表示您没有创建数据构造函数
节点
。也许您创建了一个数据构造函数
,例如:

data Tree a = Null | Tree a (Tree a) (Tree a)
例如,如果我们定义一个,我们可以计算
节点的数量,如下所示:

Prelude> length (Node 0 (Node 1 Null Null) (Node 2 Null Null))
3
如果您自己实现了长度,则应递归调用子树,因为您无法添加子树:

numberOfNodes :: Tree -> Int
numberOfNodes Null = 0
numberOfNodes (Node _ st1 st2) = 1 + numberOfNodes st1 + numberOfNodes st2
numberOfNodes::Tree->Int
numberOfNodes Null=0

numberOfNodes(Node st1 st2)=1+numberOfNodes st1+numberOfNodes st2
显然,树定义中有一个错误,因为此函数不知道
节点
。下一个问题:您不希望两个子树之间的最大值,但是节点数的最大值。这里计算的是高度,而不是节点数。
numberOfNodes :: Tree -> Int
numberOfNodes Null = 0
numberOfNodes (Node _ st1 st2) = 1 + numberOfNodes st1 + numberOfNodes st2