判断树是否完整时,“方程具有不同数量的参数”

时间:2019-07-26 08:31:53

标签: haskell binary-tree

我正试图使用​​一个函数来确定二叉树是否完整,但是编译器不断告诉我“等式具有不同数量的参数”。

猜测错误与语法有关,但我只是找不到正确的格式。

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

1 个答案:

答案 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,它将返回TruedecideCompletel上都返回r,但是它不可能返回False,因为最终子树将是Leaf,因此该节点将是True,因此通过归纳,所有您的BinaryTree将是True

为了检查一棵二叉树是否完整,除最后一个树外的所有层都应满。最后一级应包含最左侧的节点。