我正在阅读过去的大学Haskell考试论文,遇到一个涉及树木的问题,其中树木的实现方式如下:
data Tree a = Lf a -- leaf | Tree a :+: Tree a -- branch
然后继续概述可以与各种功能一起使用的示例树,例如:
((Lf 1 :+: Lf 2) :+: (Lf 3 :+: Lf 4))
我对这段代码的困惑是,它如何能在不具有根元素概念的情况下表示一棵树。我的直觉表明,此处表示的树看起来像这样:
/ \ / \ / \ 1 2 3 4
但是这样的树没有根元素,只有叶子,这在我看来当然是错误的。该代码中的树实际上是如何表达的?
它是一棵只在叶子中存储数据的树。尽管当然很多算法只能对内部节点具有数据的树进行操作(例如BST搜索),但并不要求树在内部节点中具有数据。
您可能会问这种结构在什么情况下有用。考虑霍夫曼解码,在内部节点中不需要数据。您只需遍历树,在0处向左移动,在1处向右移动,直到到达叶节点,此时已解码了一个字符。