图的遍历,非递归版本,深度优先遍历

来源:互联网 发布:网络配音培训班 编辑:程序博客网 时间:2024/05/16 15:52

 

UndirectedGraphNode 为图节点, label 存储节点数据, visited 表示节点是否已被访问过, neighbors 表示相连接的节点。

利用 stack 实现对图的深度遍历,stack 由 list 的 back(), push_back(), pop_back 方法实现。

遍历思路: 将第一个节点压入 stack_node 中, stack_node.back() 表示当前访问的节点。

若存在尚未访问的邻接节点,则将其压入 stack_node 中,标记为已访问,并将新压入的这个节点作为当前节点,继续探索。

若不存在尚未访问的邻接节点,则弹出当前节点,将 stack_node 的下一个节点作为当前节点,继续探索。


执行上面两个检测,直到 stack_node 全部弹出,则表示全部节点已被访问过。遍历完成。


struct UndirectedGraphNode {int label;bool visited = false;    vector<UndirectedGraphNode *> neighbors;    UndirectedGraphNode(int x) : label(x) {};};/** * 非递归版本,遍历图的所有节点,深度优先遍历 * */void visited_non_recusive(UndirectedGraphNode* node){list<UndirectedGraphNode*> stack_node;stack_node.push_back(node);print_node(node);node->visited = true;UndirectedGraphNode* tmp;UndirectedGraphNode* iter_tmp;while (stack_node.size() > 0) {tmp = stack_node.back();int i = 0;for ( ; i < tmp->neighbors.size(); i++) {iter_tmp = tmp->neighbors[i];if (iter_tmp->visited == false) {print_node(iter_tmp);iter_tmp->visited = true;stack_node.push_back(iter_tmp);break;}}if (i == tmp->neighbors.size()) {stack_node.pop_back();}}}


1 0
原创粉丝点击