您的位置:首页 > 职场人生

面试题常见算法之图的广度优先搜索和深度优先搜索

2017-05-20 19:59 260 查看
类似于二叉树的广度优先搜索和深度优先搜索,代码如下:

void DFS(Node root) //非递归实现
{
stack<Node> s;
root.visited = true;
printf("%d ", root.val); //访问
s.push(root); //入栈
while (!s.empty())
{
Node pre= s.top(); //取栈顶顶点
int j;
for (j = 0; j<pre.adjacent.size(); j++) //访问与顶点i相邻的顶点
{
Node cur = pre.adjacent[j];
if (cur.visited == false)
{
printf("%d ", cur.val); //访问
cur.visited = true;
s.push(cur); //访问完后入栈
break; //找到一个相邻未访问的顶点,访问之后则跳出循环
}
}
//对于节点4,找完所有节点发现都已访问过或者没有临边,所以j此时=节点总数,然后把这个4给弹出来
//直到弹出1,之前的深度搜索的值都已弹出,有半部分还没有遍历,开始遍历有半部分
if (j == pre.adjacent.size()) //如果与i相邻的顶点都被访问过,则将顶点i出栈
s.pop();
}
}
void BFS(Node root) {
queue<Node> q;
root.visited = true;
printf("%d ", root.val); //访问
q.push(root); //入栈
while (!q.empty()) {
Node pre = q.front();
q.pop();
for (Node cur : pre.adjacent) {
if (cur.visited == false) {
printf("%d ", cur.val); //访问
cur.visited = true;
q.push(cur);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CC++ 算法