数据结构之图---广度优先遍历---C++实现

一、目标图对其实现广度优先遍



二、实现深度优先遍历

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相连接的所有点且且未被访问,直至最后一层访问完毕,返回。 过程如下图所示:

注:点与点之间的关系根据邻接矩阵可得




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值