当前位置: 首页 > 知识库问答 >
问题:

在C中的BFS遍历过程中,节点中的子节点列表丢失

闾丘德宇
2023-03-14

我正在编写一段C代码来执行有向图的广度优先遍历。

在main函数中,我总共定义了7个节点,并在它们之间建立了连接。一个节点是包含名称、值和所有子节点列表的结构。

我调用函数breadthFirstTraverse(constNode

我的主要问题是,深层节点的列表似乎为空,即使子节点已添加到其中。

节点:

struct Node_ {
    std::string nodeName = "";
    uint32_t taskCost = 0x0;
    uint64_t maxCost = 0x0;
    std::list<Node_> children;
    bool visited = false;
};
typedef struct Node_ Node;

节点:

main(){

    /* Node declaration here... */

    node1.children.push_back(node2);
    node1.children.push_back(node3);
    node2.children.push_back(node4);
    node3.children.push_back(node4);
    node4.children.push_back(node5);
    node4.children.push_back(node6);
    node5.children.push_back(node7);
    node6.children.push_back(node7);

    printNode(node1);
    printNode(node2);
    printNode(node3);
    printNode(node4);
    printNode(node5);
    printNode(node6);
    printNode(node7);

    breadthFirstTraversal(node1);

}

遍历函数:

void breadthFirstTraversal(const Node& root) {

std::cout << "\n\n\nBreadth first traversal!\n";

std::list<Node> q;

// Insert first elem
q.push_back(root);

while (!q.empty()) {

    std::cout << "new iteration\n";

    Node auxNode = q.front();
    std::cout << "pop " << auxNode.nodeName << "\n";
    printNode(auxNode);
    auxNode.visited = true;

    for (Node child : auxNode.children) {
        if (!child.visited) {
            std::cout << "push child " << child.nodeName << "\n";
            q.push_back(child);
        }
    }

    q.pop_front();

}

}

这是输出。您可以看到,node2和node3没有子节点,即使节点被添加到这些列表中。

Breadth first traversal!
new iteration
pop root
Node: {name= root, taskCost=0, maxCost=0, visited=0, children=[node2,node3,]}
push child node2
push child node3
new iteration
pop node2
Node: {name= node2, taskCost=6, maxCost=0, visited=0, children=[]}
new iteration
pop node3
Node: {name= node3, taskCost=9, maxCost=0, visited=0, children=[]}

共有1个答案

秦宁
2023-03-14

在c中去排队就像取ex(),还取pop_front!您的pop_front()实际上可以弹出比该项目的孩子。这里是更新代码:

void breadthFirstTraversal(const Node& root) {

std::cout << "\n\n\nBreadth first traversal!\n";

std::list<Node> q;

// Insert first elem
q.push_back(root);

while (!q.empty()) {

    std::cout << "new iteration\n";

    Node auxNode = q.front();
    q.pop_front();
    std::cout << "pop " << auxNode.nodeName << "\n";
    printNode(auxNode);
    auxNode.visited = true;

    for (Node child : auxNode.children) {
        if (!child.visited) {
            std::cout << "push child " << child.nodeName << "\n";
            q.push_back(child);
        }
    }

}

}
 类似资料:
  • 本文向大家介绍如何在JSP中遍历XML的节点?,包括了如何在JSP中遍历XML的节点?的使用技巧和注意事项,需要的朋友参考一下 <X:的forEach>标记用于遍历XML文档中的节点。 属性 <X:的forEach>标签具有以下属性- 属性 描述 需要 默认 选择 要评估的XPath表达式 是 没有 变种 用于存储每个循环的当前项目的变量名称 没有 没有 开始 迭代的开始索引 没有 没有 结束 迭

  • 假设我有一个简单的二叉树节点类,如下所示: 如何添加一个能够递归遍历任何大小的树的方法,从左到右访问每个现有节点,而无需重新访问已遍历的节点? 这行得通吗?

  • 本文向大家介绍JQuery中节点遍历方法实例,包括了JQuery中节点遍历方法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JQuery中节点遍历方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的jQuery程序设计有所帮助。

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 我想在Java中使用for-each循环迭代节点列表。我有一个for循环和do-while循环,但不是每个循环都有。

  • 嘿,我一直在研究BFS/DFS,我注意到它们中的许多都有一个轻微的修改,即当一个节点添加到访问集时。 在某种程度上,算法将从堆栈/队列中弹出节点,然后将其添加到访问集。然后它会添加所有没有被访问过的邻居 在另一个实现中,节点不会添加到访问集。相反,它会将所有未访问的邻居添加到堆栈/队列中,但会在将这些邻居添加到堆栈/队列时将其添加到已访问集中。 总之,在一种方法中,当它们弹出到堆栈/队列时,它们被