从C#中的任意节点开始遍历一般树结构

时间:2011-10-17 12:07:10

标签: .net algorithm tree-traversal

我需要在Depth-first和Breadth-first Traversal顺序中对任意树进行树遍历算法。棘手的部分是我需要能够从任意节点开始并继续,直到遍历另一个特定节点。

现在,我可以使用任何普通算法并忽略遍历的节点,直到我点击起始节点并继续直到结束节点(我现在这样做),但这很丑陋且效率低下。

请提出任何建议。

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

3 个答案:

答案 0 :(得分:2)

我认为你所做的是最有效的方法。特别是如果你正在使用任意树木。

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

我没有看到你能做的任何优化。

答案 1 :(得分:0)

而不是

Traverse(RootNode, StartNode, EndNode)

将起始节点作为根

传递
Traverse(StartNode, EndNode)

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

答案 2 :(得分:0)

如果你不得不回答很多不相关的问题,并且你需要提供一个路径(而不仅仅是说存在或不存在),那么你不能做得比现在的AFAIK更好。

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