关于haskell:以下某些树形数据类型在计算机科学中使用的名称是什么?

What are the names used in computer science for some of the following tree data types?

有时我会在Haskell中使用不同类型的树,但我不知道它们的名称,也不知道在哪里可以使用它们或类实例获取有关算法的更多信息,甚至不知道某些早已存在的代码或库。骇客。

示例:

标签在叶子或树枝上的二叉树:

1
2
3
4
5
data BinTree1 a = Leaf |
                  Branch {label :: a, leftChild :: BinTree1 a, rightChild :: BinTree1 a}

data BinTree2 a = Leaf {label :: a} |
                  Branch {leftChild :: BinTree2 a, rightChild :: BinTree2 a}

类似地,每个子节点带有标签的树或所有子节点带有通用标签的树:

1
2
3
data Tree1 a = Branch {label :: a, children :: [Tree1 a]}

data Tree2 a = Branch {labelledChildren :: [(a, Tree2 a)]}

有时我开始使用Tree2,并且在开发过程中以某种方式将其重构为Tree1,这似乎更易于处理,但是我从未对此进行过多思考。这里有某种双重性吗?

此外,如果您可以张贴其他您认为有用的其他种类的树,请这样做。

总而言之:您可以告诉我的那些树的所有内容将非常有用! :)

谢谢。

编辑:

说明:这不是家庭作业。只是我通常最终会使用这些数据类型并创建实例(Functor,Monad等),也许,如果我重新命名它们,我会发现带有已实现内容和更多理论信息的库。

通常,当Hackage上的库名称为Tree时,它实现BinTree2或某种版本的非二进制树,仅在叶子上带有标签,因此在我看来,Tree2和BinTree2可能具有其他名称或标识符。

我还觉得可能存在某种双重性或同构性,或者一种将使用Tree1的代码转换为使用Tree2进行某些转换的代码的方法。有没有?可能只是印象。


我听到的名字:

  • BinTree1是二叉树
  • BinTree2不知道名称,但是您可以使用这样的树来表示无前缀的代码,例如霍夫曼编码
  • Tree1是一棵玫瑰树
  • Tree2[Tree1](Tree1的林)是同等的,或者另一种查看方式是Tree1,没有根标签。


仅在叶子中具有标签(BinTree2)的二叉树通常用于哈希映射,因为树结构本身除了叶子的二进制位置外不提供任何信息。

因此,如果您有4个带有以下哈希码的值:

1
2
3
4
...000001 A
...000010 B
...000011 C
...000010 D

...您可以将它们存储在二叉树中(隐式的patricia trie),如下所示:

1
2
3
4
5
6
7
     +          <- Bit #1 (least significant bit) of hash code
    / \\            0 = left, 1 = right
   /   \\
[B, D]  +       <- Bit #2
       / \\
      /   \\
     [A]  [C]

我们看到,由于BD的哈希码以0"开始",因此它们存储在左根孩子中。它们具有完全相同的哈希码,因此不再需要派生。 AC的哈希码都以" 1"开始,因此需要另一个fork。 A的第2位为0,因此它位于左侧,带有1的C位于右侧。

这种哈希表的实现有点不好,因为插入某些元素时可能必须重新计算哈希,但是没关系。

BinTree1只是普通的二叉树,用于基于快速顺序的集合。真的,无话可说。

Tree1Tree2之间的唯一区别是Tree2不能具有根节点标签。这意味着,如果用作前缀树,则它不能包含空字符串。它的用途非常有限,在实践中我还没有看到任何类似的东西。但是,正如我所说,Tree1显然可用作非二进制前缀树。