我正试图使用一个函数来确定二叉树是否完整,但是编译器不断告诉我“等式具有不同数量的参数”。
猜测错误与语法有关,但我只是找不到正确的格式。
data BinaryTree a = Leaf a | Node (BinaryTree a) a (BinaryTree a)
...
decideComplete :: BinaryTree Int -> Bool
decideComplete (Node l _ r) = (decideComplete l) && (decideComplete r)
decideComplete Leaf v = True
答案 0 :(得分:4)
您的decideComplete
函数使用一个BinaryTree Int
(也许您想将其概括为BinaryTree a
)。 Leaf
不是BinaryTree a
,它是一个带有参数的数据构造函数,因此您应该添加方括号,例如:
decideComplete :: BinaryTree a -> Bool
decideComplete (Node l _ r) = (decideComplete l) && (decideComplete r)
decideComplete (Leaf v) = True
话虽这么说,您的函数将在这里为所有所有树生成True
(当然,除非树具有无限数量的节点,但是在这种情况下,它只会被卡在无限循环或内存不足)。实际上:对于所有Leaf
,它将返回True
,对于Node l _ r
,它将返回True
在decideComplete
和l
上都返回r
,但是它不可能返回False
,因为最终子树将是Leaf
,因此该节点将是True
,因此通过归纳,所有您的BinaryTree
将是True
。
为了检查一棵二叉树是否完整,除最后一个树外的所有层都应满。最后一级应包含最左侧的节点。