Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
Graph 用于节点搜索的图遍历_Graph_Tree_Graph Algorithm_Tree Traversal - Fatal编程技术网

Graph 用于节点搜索的图遍历

Graph 用于节点搜索的图遍历,graph,tree,graph-algorithm,tree-traversal,Graph,Tree,Graph Algorithm,Tree Traversal,在下图中,子部分以递归方式遍历。每个孩子都必须报告其直系父母。问题是子项[3]必须同时在同一行中报告其直接父项(即子项[2]和子项[4]) traverse(Node node) { if(node == null) return; for(Node child : node.getChilds()) { traverse(child); } } Parent |---child[1] | child[2] |

在下图中,子部分以递归方式遍历。每个孩子都必须报告其直系父母。问题是子项[3]必须同时在同一行中报告其直接父项(即子项[2]和子项[4])

traverse(Node node)
{
    if(node == null)
        return;

    for(Node child : node.getChilds()) {
        traverse(child);
    }
}

Parent 
|---child[1]
|       child[2]
|           child[3]
|---child[4]
        child[3]
现在我一次遍历一个节点,生成的输出是-

Node      Immediate Parent
--------------------------
child[2]  child[1]
child[3]  child[2]
child[3]  child[4]
预期产量为-

Node      Immediate Parent
--------------------------
child[2]  child[1]
child[3]  child[2], child[4]
搜索节点并生成图形预期输出的最佳方法是什么?任何帮助都将不胜感激。

如果您有(或可以添加)一个回到父节点的链接,您可以在第一次遇到节点时列出所有父节点,然后在重复访问时跳过该链接。您可以使用多个选项跟踪节点是否已被访问:

  • 维护一组已访问的节点,并检查当前节点是否在该组中。如果没有,则进行处理并将其添加到集合中;否则跳过

    优点:一般方法

    缺点:如果图形较大,则可能需要大量内存来维护集合

  • isvisted
    成员值添加到节点(默认设置为
    false
    ),并在遇到节点时检查该值:如果该值为
    false
    ,则处理该节点并将
    isvisted
    设置为true;否则跳过

    优点:附加内存少

    缺点:具有侵入性、任务特定性,即使不需要,也存在额外的变量,对于需要多个“是否已处理”决策的任务来说,无法很好地扩展

  • 如果“父链接”选项不可用,则可以在额外映射中维护子级到父级的关系。:在处理节点时从子级映射到父级集。完成初始处理(构建映射)后,您将迭代映射并列出每个节点及其父节点

    与直接父链接相比的优点是,在构建/修改图形时无需额外维护(除非您也希望使映射保持最新)

    缺点是,在对图的结构进行一系列修改后,每次需要处理图时,都必须重新构建映射(除非--请参见adventage注释)


    注意:如果图中有一个有向(父到子)圆,则通过遍历所有子图来遍历一般图可能导致无限循环。我想您的问题并非如此,只是为了涵盖所有基础:您可以在处理图形时维护一组“已访问”的节点。可用选项的讨论与第一个示例(“链接回父节点”)部分中的讨论相同,在第一个示例中,您给出了一个循环,因此它不是一棵树,而是一个图形。@Betabando实际上我认为他描述的图形是一个什么是节点的实际结构?什么约束将决定哪种搜索方法是最好的?