Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在树中查找路径的有效数据结构是什么?_Algorithm_Data Structures_Graph_Tree - Fatal编程技术网

Algorithm 在树中查找路径的有效数据结构是什么?

Algorithm 在树中查找路径的有效数据结构是什么?,algorithm,data-structures,graph,tree,Algorithm,Data Structures,Graph,Tree,给定一棵树:我们希望支持查找节点之间的路径,同时查找特定节点的子节点 1 / \ 2 3 / \ \ 4 6 5 / 7 查找两个节点之间路径的有效数据结构是什么 4->5(路径为4 2 1 3 5) 我想我可以将其建模为一个相邻的列表,然后执行一个简单的BFS 但同时我们也希望保持节点的顺序,因为我们将有这种类型的查询 打印节点2的所有子节点。。。答案是4,6,7 我必须存储父点

给定一棵树:我们希望支持查找节点之间的路径,同时查找特定节点的子节点

          1
        /   \
       2     3
     /  \     \
    4    6     5
   /
  7
查找两个节点之间路径的有效数据结构是什么 4->5(路径为4 2 1 3 5)

我想我可以将其建模为一个相邻的列表,然后执行一个简单的BFS

但同时我们也希望保持节点的顺序,因为我们将有这种类型的查询 打印节点2的所有子节点。。。答案是4,6,7

我必须存储父点吗? 我觉得我缺少了一个重要的数据结构,不相交集会有帮助吗?
任何指向CLR、算法设计手册、在线资源的指针或参考都会有所帮助,这要感谢树上两个顶点之间的每条路径都经过它们的最低共同祖先(LCA),这是该路径上最接近根的唯一顶点。有一些高效的数据结构可以在固定时间内查询LCA,但它们需要一些工作来实现。如果您确实实现了它们,那么依次从两个给定顶点x和y开始,您只需沿着树往回走,直到通过调用lca(x,y)找到您已经识别的顶点

如果您不想实现这些数据结构,并且可以容忍与树的深度成比例的运行时和内存使用(通常情况下是这样),则可以执行大致相同的操作,但在每种情况下都要走回根目录,在进入相应列表时存储顶点(一个列表代表x,一个列表代表y)。到达根目录后,通过考虑每个列表的最后一项,然后是每个列表的倒数第二项等,以相反的顺序处理这些列表,寻找第一对不同的顶点(或“返回”其中一个列表的开头):前一个顶点是LCA

为了在每个节点中存储子节点,只需使用父指针之外的常规表示


[编辑:正如Peter de Rivaz指出的那样,如果你知道两个顶点的深度,那么你可以在不使用LCA数据结构的情况下获得与使用它们相同的时间复杂度:只需从较深的顶点向上走,直到两个顶点处于同一水平,然后平行向上走,直到碰到相同的顶点。这避免了going一直到根部。]

如果你知道x和y的深度,大概你可以向上走,直到它们达到相同的深度,然后平行向上走,直到你到达LCA(如果路径很短,避免一直走到根部)