最近在数据结构的学习中,学习到了图这一章节,在图中,有两个遍历的策略:一种是广度优先遍历,一种是深度优先遍历。
先上运行结果吧
图的结构
这里以D顶点为起始顶点
广度优先遍历
首先我们介绍广度优先遍历,在介绍图的广度优先遍历之前,先回顾一下树的广度优先遍历,就是层序遍历。下面是树的层序遍历代码
void LevelOrder(BitTree t) {
Linkqueue q;//声明一个链队列
initQueue(q);//初始化一个链队列
BitTree p;
enqueue(q, t);//把根节点入队
while (!isEmpty(q)) {//队列不空就循环
dequeue(q, p);//队头结点出队
visit(p);//访问出队结点
if (p->lchild != NULL)
enqueue(q, p->lchild);//左孩子入队
if (p->rchild != NULL)
enqueue(q, p->rchild);//右孩子入队
}
}
使用队列,遍历到一个节点,就把对应的孩子结点入队,这样就可以一层一层的遍历出二叉树,根据树的结构,什么树都可以层次遍历出来。同样的,图的广度优先遍历和树一样,但是不同的是,树不存在回路,而图,特别是无向图,可能存在多的回路。如果不做特殊处理,那么按照树的遍历方式遍历图,会造成循环。
所以,我们还需要设置一个标记数组,记作visited,这个数组和图的顶点序列数组一致,数组的每一项都对应了一个顶点,设置bool值来反应,通过索引值可以比较方便判断顶点是否被遍历过。
bool visited[MAXSIZE];//全局
在开始之前,我们还需要两个函数,一个函数用来求x顶点的第一个和它直接连通的顶点。一个函数用来求除开y顶点,和x顶点直接连通的