Haskell中的二叉树类型构造函数

时间:2017-04-28 12:16:30

标签: haskell constructor tree binary-tree

我尝试使用二进制树类型构造函数:

data Tree a = Leaf a | Branch a (Tree a) (Tree a)

我们如何证明这个构造函数不能表示所有类型的二叉树?我们如何改进这个定义以涵盖所有类型的二叉树?它是如何工作的?

2 个答案:

答案 0 :(得分:2)

您的Tree aa和每个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]