我尝试使用二进制树类型构造函数:
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
我们如何证明这个构造函数不能表示所有类型的二叉树?我们如何改进这个定义以涵盖所有类型的二叉树?它是如何工作的?
答案 0 :(得分:2)
您的Tree a
在a
和每个Branch
构造函数中都有Leaf
类型的标签。因此,例如,Branch 'u' (Branch 'n' (Leaf 'i') (Leaf 'p')) (Leaf 'z')
看起来像这样:
+-'u'-+
| |
+-'n'-+ 'z'
| |
'i' 'p'
例如,排除在节点和叶子上具有不同标签的树木,或仅在内部或仅在外部标记的树木。例如,此树在叶子处有数字,在节点处有字符。
+-'o'-+
| |
+-'h'-+ 9
| |
7 2
(您可以使用Tree (Either n l)
但不会对仅在内部显示n
并且仅在外部显示l
的不变量进行编码。)
由于这似乎是一项家庭作业,我不会告诉你一般更类型的树是什么样的,但我相信你可以弄明白。
答案 1 :(得分:1)
问问自己,你的树有多少a
个值?它们出现在叶子或节点中,
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
所以
num_values = 1 | ( 1 + num_values + num_values )
这种形式没有多大意义,所以让我们把它写成
numvals = 1 : [ 1 + s | s <- diagonalize
[ [ n + m | m <- numvals ]
| n <- numvals ] ]
diagonalize :: [[a]] -> [a]
diagonalize ((n:ns):t) = n:go [ns] t
where
go as (b:bs) = map head as ++ go (b:map tail as) bs
这样我们就得到了
〜&GT;拿100个数字
[1,3,5,5,7,7,7,7,7,9,9,9,9,9,11,9,9,9,11,11,11,11,9,9,11 ,13,11,13,11,9,9,11,13,1 3,13,13,11,9,9,11,13,13,15,13,13,11,11,11,11,13,13,15,15,13,13,11,11,11, 13,13,13 ,15,15,15,13,13,13,11,11,13,15,13,15,15,15,15,13,15,13,11,11,13,15,15,15,15 ,15,1 5,15,15,15,13,11,11,13,15,15,17,15,15]
但您希望 0,2,4,... 也出现在那里。
编辑:
很容易解决这个问题data Tree a = Leaf | Branch a (Tree a) (Tree a)
现在
numvals2 = 0 : [ 1 + s | s <- diagonalize
[ [ n + m | m <- numvals2 ]
| n <- numvals2 ] ]
和
〜&GT;取100个数量2 [0,1,2,2,3,3,3,3,3,4,4,4,4,4,5,4,4,4,5,5,5,5,4,4,5 ,6,5,6,5,4,4,5,6,6,6,6,5,4,4,5 ,6,6,7,6,6,5,5,5,5,6,6,7,7,6,6,5,5,5,6,6,6,7,7,7,6 ,6,6,5,5,6,7,6,7,7,7,7,6,7,6,5 ,5,6,7,7,7,7,7,7,7,7,7,6,5,5,6,7,7,8,7,7]