一、目标图对其实现广度优先遍
二、实现深度优先遍历
1、结点的描述
2、图的描述
以上描述见上篇:数据结构之图--深度优先遍历---C++实现 :http://blog.csdn.net/wys2011101169/article/details/52238644
//在main.cpp中添加
//当我们调用的深度优先后,结点已经设置为访问过了,所以需要重置一下,在调用广度优先遍历
cout << endl;
pMap->resetNode();
pMap->breadthFirstTraverse(0);
三、深度优先遍历的算法分析
算法核心代码//CMap.cpp
void CMap::breadthFirstTraverse(int nodeIndex){
cout << m_pNodeArray[nodeIndex].m_cData << " ";
m_pNodeArray[nodeIndex].m_bisVisited = true;
vector<int> curVec;
curVec.push_back(nodeIndex);
breadthFirstTraversalImpl(curVec);
}
void CMap::breadthFirstTraversalImpl(vector<int> preVec) //广度优先遍历实现函数
{
int value = 0;
vector<int> curVec;
for (int j = 0; j < (int)preVec.size();j++)
{
for (int i = 0; i < m_iCapacity;i++)
{
getValueFromMatrix(preVec[j], i, value);
if (value !=0)
{
if (m_pNodeArray[i].m_bisVisited)
{
continue;
}
else
{
cout << m_pNodeArray[i].m_cData << " ";
m_pNodeArray[i].m_bisVisited = true;
curVec.push_back(i);
}
}
}
}
if (curVec.size() == 0)
{
return;
}
else{
breadthFirstTraversalImpl(curVec);
}
}
算法思路(以上图为例):一层一层的遍历,以A点出发同时置A已被访问,遍历所有与A点相连接的点(B点,D点)。再将B,D的索引放入curVec中,双重for循环,找与B点相连接所有的点且未被访问(C点,F点),然后找与D点相连接的所有的点且未被访问(G点,H点)。再将(C,F,G,H)放入curVec中,调用深度遍历,调用递归,依次找到与C,F,G,H相连接的所有点且且未被访问,直至最后一层访问完毕,返回。 过程如下图所示:
注:点与点之间的关系根据邻接矩阵可得