如何修改preorder树遍历算法来处理多个父节点?

时间:2010-04-21 09:01:26

标签: algorithm tree-traversal

我一直在寻找一段时间,似乎无法找到替代解决方案。我需要树遍历算法,如果可能的话,节点可以有多于1个父节点(在这里找到一篇很棒的文章:Storing Hierarchical Data in a Database)。是否有任何算法,从根节点开始,我们可以确定节点的顺序和依赖性(目前正在阅读拓扑排序)?

4 个答案:

答案 0 :(得分:2)

您描述的结构不是树,它是有向图。因为它适用于分层drawing,你可能会想到它是一棵树(它本身就是一个非循环的连接图)。

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

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

如您所见,可以将任何具有非循环定向形式的图形视为树,并对其应用树算法。只要您不能保证此属性,就必须使用专用图算法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

否则,您必须拆分子节点并复制另一个父节点的分支。 (这当然会导致以后出现不一致和/或不合理的算法,具体取决于您是否需要维护数据结构。)

如果您坚持使用definition只能有一个父树的树结构,则上述选项成立。

所以,如果节点可以有两个父节点,那么你可能需要退一步解释你想要完成什么,以及为什么它必须是树结构。

答案 3 :(得分:0)

你这里没有描述一棵树。您可以将图表称为树。

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

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

你不能只是以“父母”在“上方”或“指向顶点”的方式布置任意图形,并且子项“低于”或“顶点指向它们”。树是树,因为选择了根。你在问题中描述的不是一棵树。树遍历算法 NOT 适用于遍历任意图形。

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