Haskell中Tree的数据类型

时间:2016-12-31 13:57:24

标签: haskell types

对于二叉树的数据类型,您可以编写如下内容:

data Tree a = Nil | Node a (Tree a) (Tree a)

因此,如果我想要包含树,而节点只有两个子节点,那么数据类型可能看起来像什么?

2 个答案:

答案 0 :(得分:8)

一个鲜为人知的技术是Left-child right-sibling,你可以使用完全相同的类型来编码每个节点有两个以上子节点的树:

left-child-right-sibiling

data Tree a
  = Nil
  | Node a (Tree a) (Tree a) -- value, left child, right sibling

替代[Tree a]使具有性能优势,因为Haskell列表是链接列表。

答案 1 :(得分:5)

您可以拥有固定的分支因子:

data BinaryTree a  = BTNil 
                   | BTNode a (BinaryTree a) (BinaryTree a)

data TernaryTree a = TTNil
                   | TTNode a (TernaryTree a) (TernaryTree a) (TernaryTree a)

data QuadTree a    = QTNil
                   | QTNode a (QuadTree a) (QuadTree a) (QuadTree a) (QuadTree a)

-- etc

(请注意,QuadTree不是分支因子为4的常规树的好名称,因为有specific data structure with that name。)

或者您只需使用玫瑰树,它会在每个节点上存储任意子项列表。

data RoseTree a = RTNil | RTNode a [RoseTree a]

这里有一些重复,因为RTNil 需要存储显式空树。叶节点只是RTNode a []。 (考虑您将分配给值RTNode 3 []RTNode 3 [RTNil]RTNode 3 [RTNil, RTNil]等的差异(如果有)。