/////////////////////////////////////////////////
//DepthFirst()公有成员函数
//采用非递归的方式深度遍历当前图
/////////////////////////////////////////////////
template<class T,class E>
void Graphlink<T,E>::DepthFirst(int start)
{
visited=new bool[numVertices]; //是否被访问过的标记
for(int i=0;i<numVertices;i++)
visited[i]=false;
LinkedStack<int> Stack; //回溯过程中用到的堆栈
int p=start; //指向当前的结点
int parent=-1; //指向当前结点的遍历父结点
int first; //存放获取长子结点号
int next; //存放下个兄弟结点的地址
do
{
cout<<getValue(p)<<" "; //访问当前结点p
visited[p]=true; //设置已经访问过
first=getFirstNeighbor(p); //获取当前访问结点p的未访问过的第一个邻接结点号
while(first!=-1 && visited[first]==true)
first=getNextNeighbor(p,first); //继续看下个邻接结点
if(first!=-1) //如果不是根结点而且长子结点不空
{
if(p==start) //如果当前访问的结点是根结点
next=-1; //则没有下个兄弟结点
else
{
next=getNextNeighbor(parent,p);//寻找p之后第一个未被访问的第一个兄弟结点
while(next!=-1 && visited[next]==true)
next=getNextNeighbor(parent,next);
};
if(next!=-1) //如果p的下个兄弟结点存在,且不在堆栈中
{
Stack.Push(parent); //先把父结点压入堆栈
Stack.Push(next); //再把该下个兄弟结点压入堆栈
};
parent=p;
p=first; //下个结点
}
else //如果长子结点是空的
{
if(p==start) //如果就是根结点
break; //推出遍历循环
else
{
do
{
Stack.Pop(p); //从堆栈中弹出一个结点作为下个结点
Stack.Pop(parent); //从堆栈中同时获得
}
while(visited[p]!=false); //弹出的结点如果是已经访问过的,就继续弹
};
};
}while(first!=-1 || !Stack.IsEmpty()); //如果堆栈和长子结点都空了,说明遍历结束
};
/////////////////////////DepthFirst()公有函数结束
//DepthFirst()公有成员函数
//采用非递归的方式深度遍历当前图
/////////////////////////////////////////////////
template<class T,class E>
void Graphlink<T,E>::DepthFirst(int start)
{
visited=new bool[numVertices]; //是否被访问过的标记
for(int i=0;i<numVertices;i++)
visited[i]=false;
LinkedStack<int> Stack; //回溯过程中用到的堆栈
int p=start; //指向当前的结点
int parent=-1; //指向当前结点的遍历父结点
int first; //存放获取长子结点号
int next; //存放下个兄弟结点的地址
do
{
cout<<getValue(p)<<" "; //访问当前结点p
visited[p]=true; //设置已经访问过
first=getFirstNeighbor(p); //获取当前访问结点p的未访问过的第一个邻接结点号
while(first!=-1 && visited[first]==true)
first=getNextNeighbor(p,first); //继续看下个邻接结点
if(first!=-1) //如果不是根结点而且长子结点不空
{
if(p==start) //如果当前访问的结点是根结点
next=-1; //则没有下个兄弟结点
else
{
next=getNextNeighbor(parent,p);//寻找p之后第一个未被访问的第一个兄弟结点
while(next!=-1 && visited[next]==true)
next=getNextNeighbor(parent,next);
};
if(next!=-1) //如果p的下个兄弟结点存在,且不在堆栈中
{
Stack.Push(parent); //先把父结点压入堆栈
Stack.Push(next); //再把该下个兄弟结点压入堆栈
};
parent=p;
p=first; //下个结点
}
else //如果长子结点是空的
{
if(p==start) //如果就是根结点
break; //推出遍历循环
else
{
do
{
Stack.Pop(p); //从堆栈中弹出一个结点作为下个结点
Stack.Pop(parent); //从堆栈中同时获得
}
while(visited[p]!=false); //弹出的结点如果是已经访问过的,就继续弹
};
};
}while(first!=-1 || !Stack.IsEmpty()); //如果堆栈和长子结点都空了,说明遍历结束
};
/////////////////////////DepthFirst()公有函数结束