【发布时间】:2021-05-19 12:58:01
【问题描述】:
我需要实现一个 Tree 数据结构,它应该有多个根,而不仅仅是 1 个根。看看这个场景,假设我必须为“书籍内容”实现树数据结构。分别是“Chapters > Sections > Sub-Sections”等。主要问题是:这里有多个根,第1章,第2章,第3章等等。根节点一定要从章节开始,因为从章节开始内容的类型和功能都是一样的。
我的任务需要什么:
- 多根树
- 节点在同一父级之间按水平顺序排列
- 它是一棵非二叉树,这意味着可以有任意数量的根和任意数量的子树。
我提出了一个解决方案,但我认为这是一种混乱的方法。我做了一个类,就像通常为树数据结构做的那样。此类是“SimpleTree”,适用于单个章节作为根节点。为了使多个根节点成为可能,我创建了另一个类“TopWrapperForSimpleTree”。这个顶级包装器类有一个 Array 以便将多个“SimpleTree”元素存储到它(基本上是多个根)。这里混乱的部分是我必须复制“SimpleTree”的每个函数并为包装类定义它。例如,“遍历函数”将遍历“SimpleTree”中的所有元素。但是现在我必须为“TopWrapperForSimpleTree”类实现一个“遍历函数”,它必须遍历所有调用遍历函数的根并连接结果。其他功能也是如此,例如查找节点、删除节点等。
总而言之,我需要一个可以有多个根的树数据结构。它也应该被订购。顺序很重要。
【问题讨论】:
-
“多根树”不是树。你似乎描述了一个森林。但是你应该只添加一个根节点。章节属于书,书是根节点。您不需要多个根的数据结构。您需要一个数据结构,其中节点是多功能的,可以表示一本书、一章、一节等,而无需复制代码。 OOP 非常适合(继承)。
-
@trincot 但它不是相同的节点类型。我不能只是把书扔在那里。假设数据为titleText 和pageNumbers。所有的章、节和小节都有这种数据,但根节点没有任何这种数据。这里的根“书”基本上是一个局外人,包含它是没有意义的。
-
@trincot 如果我确实将 Book 设为 root。我将如何制作构造函数?如果我为普通节点创建构造函数,它将包含一些书籍节点不允许的变量和函数。如果构造函数是为 Book Node 创建的,反之亦然。
-
通过 OOP 设计,您可以覆盖构造函数,该构造函数本身将在继承链中调用其父构造函数。创建一个具有共同特征的泛型类,并让所有其他类继承自它,以便它们可以在此基础上实现自己的细节。
-
@trincot 基本上,这就是这里没有共同特征的问题。 Book 节点应该能够创建子节点,但不能参与函数。继承基本上会使它们相同。
标签: data-structures tree