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();
}
}
}