我需要在Depth-first和Breadth-first Traversal顺序中对任意树进行树遍历算法。棘手的部分是我需要能够从任意节点开始并继续,直到遍历另一个特定节点。
现在,我可以使用任何普通算法并忽略遍历的节点,直到我点击起始节点并继续直到结束节点(我现在这样做),但这很丑陋且效率低下。
请提出任何建议。
更新:我的每个节点都有一个与之关联的ID。在某些情况下,我有开始和结束节点引用。在其他情况下,我有两个ID,我通过检查它们的ID检查给定节点是起始节点还是结束节点。我使用深度优先遍历来查找起始节点。开始和结束节点都可以位于层次结构中的任何位置。我希望有人可以提出一个想法,我已经给出了对起始节点和终端节点的引用。顺便说一句,树中的节点实际上是按照排序顺序排序的,从一个节点的每个子节点开始,从0开始,并且有一个根节点
答案 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更有效率。