【问题标题】:Traversing a general tree structure starting from an arbitrary node in C#从 C# 中的任意节点开始遍历一般树结构
【发布时间】:2011-10-17 12:07:09
【问题描述】:

我需要深度优先和广度优先遍历顺序的任意树的树遍历算法。棘手的部分是我需要能够从任意节点开始并继续直到遍历另一个特定节点。

现在,我可以使用任何普通算法并忽略遍历的节点,直到我到达开始节点并继续直到结束节点(我目前正在这样做),但这既丑陋又低效。

任何建议,请。

更新:我的每个节点都有一个与之关联的 ID。在某些情况下,我有开始和结束节点引用作为开始。在其他情况下,我有两个 ID,我通过检查它们的 ID 来检查给定节点是开始节点还是结束节点。我使用深度优先遍历来查找起始节点。开始节点和结束节点都可以位于层次结构中的任何位置。我希望有人可以为我已经参考起始节点和结束节点的情况提出一个想法。 BTW,树中的节点实际上是按照排序顺序排序的,一个节点的每个子节点从0开始,并且有一个根节点

【问题讨论】:

  • 如何在不遍历树的情况下找到起始节点?
  • 您是否已经拥有节点?否则,您需要第二个数据结构来加速查找开始/结束节点。
  • 请指定您的树的结构。是否实施了任何排序顺序?节点是如何关联的?
  • 他可能正在搜索节点。一旦找到它,他就可以在那里开始 DF Traversal 或 BF Traversal。你是使用 DFS 还是 BFS 来查找起始节点?
  • 如果每个节点都作为 ID 为什么不保留一个查找字典来获取该节点?字典

标签: .net algorithm tree-traversal


【解决方案1】:

我认为你正在做的是最有效的方法。尤其是当您使用任意树时。

给你一棵任意树,你需要找到开始遍历的节点。由于没有层次结构(即:它不是二叉树),您将不得不扫描节点(如果给定节点是叶节点或节点不在树中,您可能最终扫描超过一半的节点将不得不搜索整个树),直到找到要开始的节点。找到节点后,您可以启动 DF Traversal 或 BF Traversal。

我没有看到你可以做任何优化。

【讨论】:

    【解决方案2】:

    而不是

    Traverse(RootNode, StartNode, EndNode)
    

    将起始节点作为根传递

    Traverse(StartNode, EndNode)
    

    但是,如果要返回不是起始节点的子节点的节点,则必须继续使用当前方法。

    【讨论】:

      【解决方案3】:

      如果您将不得不回答许多不相关的查询,并且您需要提供一条路径(而不是只说存在与否),那么您无法比现在 AFAIK 做得更好。

      另一方面,如果您期望大量查询涉及少量特定节点(例如,从 A 到 B、C、D、E、F 和 G 的路径是什么?)那么您可以首先计算minimum spanning tree 来自该节点,让您的 BFS 更高效。

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多