对于二叉树的数据类型,您可以编写如下内容:
data Tree a = Nil | Node a (Tree a) (Tree a)
因此,如果我想要包含树,而节点只有两个子节点,那么数据类型可能看起来像什么?
答案 0 :(得分:8)
一个鲜为人知的技术是Left-child right-sibling,你可以使用完全相同的类型来编码每个节点有两个以上子节点的树:
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]
等的差异(如果有)。