【发布时间】:2014-05-18 16:28:21
【问题描述】:
我正在阅读Jorge Gajon's Trees as Linked Lists in Common Lisp,其中包括对用 Lisp 完成的树的描述。作者给出了这个基本的例子:
然后给出一个 Lisp 列表表示:
(1 (2 6 7 8) 3 (4 (9 12)) (5 10 11))
其中位置意味着层次结构级别:1 在列表中是第一个,即它在顶部,2 在下一个级别,但它是其级别的顶部,等等。但是他给出了这个警告:
请注意,如果您需要在生产程序中表示树,则不应使用此处描述的列表,除非您有充分的理由。这只是一个了解 cons 单元如何工作的练习。
好的,在“生产”代码中应该如何表示树形数据结构?顺便说一句,我还想看一个无环有向图的示例,即类似树的东西也具有“多父”功能。例如在上图中,8 是 2 的孩子,但也是 3。我猜是这样的:
(1 (2 6 7 8) (3 8) (4 (9 12)) (5 10 11))
但似乎我已经创建了一个 8 的“影子”双胞胎,并没有真正说明作为 3 的孩子的 8 与同样有 2 作为父母的 8 的关系。如果我想让 3 作为 12 的父母,这个问题会变得更糟。
(1 (2 6 7 8) (3 8 12) (4 (9 12)) (5 10 11))
可以这么说,12 处于较低层次的事实在洗牌中迷失了。
在 Lisp/Scheme/Clojure 世界中是否存在对数据结构的良好和适当的处理(书籍等)?我只发现过这样的一次性东西。
【问题讨论】:
-
顺便说一下,以这种方式定义树的问题在于,无法区分属于树的部分的conses和属于在树中作为元素。解决这个问题的方法是定义数据结构(使用
defstruct或defclass)以将元素和树结构包含在单独的插槽中,无需区分它们。
标签: data-structures common-lisp