【问题标题】:How to modify preorder tree traversal algorithm to handle nodes with multiple parents?如何修改前序树遍历算法以处理具有多个父节点的节点?
【发布时间】:2011-02-10 12:14:03
【问题描述】:

我已经搜索了一段时间,似乎找不到替代解决方案。如果可能的话,我需要一个节点可以有多个父节点的树遍历算法(在这里找到一篇很棒的文章:Storing Hierarchical Data in a Database)。有没有什么算法可以从根节点开始,确定节点的顺序和依赖关系(目前读拓扑排序)?

【问题讨论】:

  • 投反对票...只是希望他们发表评论,以便我们改进.....
  • 您会将数据存储在数据库中吗?如果不忽略上面的文章,它是特定于“关系数据库中的分层数据”问题。
  • 顺便说一句 +1 表示无法解释/不该投反对票。

标签: algorithm tree-traversal


【解决方案1】:

您描述的结构不是树,而是有向图。由于它适用于分层drawing,您可能会想将其视为一棵树(它本身是一个无环连通图)。

图的典型遍历算法是depth-firstbreadth-first。图形实现只是不同,因为它记录了它已经访问过的节点,以避免多次访问某些节点。但是,如果您的数据结构保证它是非循环的,您可以通过简单地将“父母”视为“孩子”来在图上使用树算法。

我做了一个简单的草图来说明我的意思(尝试 Google Docs 的新绘图功能的绝佳机会):

如您所见,可以将任何具有无环有向形式的图视为一棵树,并在其上应用树算法。一旦你不能保证这个属性,你就必须使用专门的图算法。

【讨论】:

  • 哇...图表看起来非常令人生畏,会试一试。我也在检查依赖算法。感谢您的快速回复!
  • 我很困惑。在原始图 1->3 中,但在遍历中 3->1 这怎么可能?
【解决方案2】:

一棵树基本上是一个有向无权图,其中每个顶点有 N 或更少的边,并且不会发生循环。
如果您确定树中没有循环,则可以将父节点视为指定节点的另一个子节点,并正常执行前序遍历。
但是,如果可能发生循环,则需要图形算法。
具体来说:Breadth first search.

【讨论】:

  • 谢谢!实现它应该很容易,尽管我可能会选择树,因为它需要经常检索。 :)
【解决方案3】:

只是检查一个简单的案例:两个父母可以有不同的父母吗? 如果不是,您可以(从概念上)将它们变成单个节点并再次拥有一棵树。

否则,您将不得不拆分子节点并为另一个父节点复制一个分支。 (这当然会导致以后出现不一致和/或算法无效,这取决于您是否需要维护数据结构。

如果您坚持使用树结构,则上述选项仍然适用,definition 只能有一个父级。

因此,也许您需要退后一步,解释您要完成什么,以及如果节点可以有两个父节点,为什么它必须是树结构。

【讨论】:

    【解决方案4】:

    你在这里描述的不是一棵树。您可以将您的图表称为树。

    树是没有循环的无向图。父/子关系不是对绘制在边缘的方向的解释。它们是命名一个顶点的结果。

    我们将一个顶点命名为“父节点”,因为它是根路径的下一个节点。与当前顶点相邻的所有其他顶点都是“子”。

    您不能仅仅以“父母”在“上方”或“指向顶点”,而孩子在“下方”或“顶点指向他们”的方式布置任意图表。一棵树之所以是一棵树,是因为它的根被采摘了。您在问题中描述的不是一棵树。并且树遍历算法适用于遍历任意图。

    有几种图遍历算法,例如breadth-first searchdepth-first search(查看这些页面中的附注了解更多信息)。使用它们而不是试图将您的全功能图表与您对树的知识联系起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      相关资源
      最近更新 更多