这篇我们来解决下上一篇留下的两个问题:深度优先生成树和广度优先生成树如何建立?
1.深度优先生成树
首先,我们需要读懂的是邻接表下的深度优先生成树,因为这种结构下的方法比较容易推敲,理解之后进而推广到邻接多重表上。
我们先以《数据结构(C语言版)》–严蔚敏、吴伟民编著的教材上算法7.7为例,分析下深度优先生成树是如何建立的:
void DFSTree(Graph G,int v,CSTree &T)
{
//从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。
visited[v]=true;
bool first=true;
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
{
if(!visited[w])
{
p=(CSTree)malloc(sizeof(CSNode)); //分配孩子结点
*p={GetVex(G,w),NULL,NULL};
if(first) //w是v的其他未被访问的邻接顶点
{
T->lchild=p; //是根的左孩子顶点
first=false;
}
else //w是v的其他未被访问的邻接顶点
{
q->nextsibling=p; //是上一邻接顶点的右兄弟结点
}
q=p;
DFSTree(G,w,q);
}
}
}
我们看看邻接表下需要什么,那么我们也为邻接多重表提供什么:
1.CSNode结构体 //树的结点结构体,拥有数据域,左孩子结点指针域,右兄弟结点指针域
2.全局变量visited[]; //访问标志数组
3.局部变量first; //是否第一个被访问的标志
4.int w=FirstAdjVex(G,v); //w是顶点v的第一个邻接顶点,我在上一篇文章中已经给出了AdjVexNotVisit函数,用于查找未访问的邻接顶点,很好,可以直接使用这个函数 。
5.p=(CSTree)malloc(sizeof(CSNode));
*p={GetVex(G,w),NULL,NULL}; //分配一个新的孩子结点,并初始化它的内容。那么我们可以用C++的语言完成这件事:
CSNode *p=new CSNode; //为该邻接点创建孩子结点
p->data=w;
p->firstchild=NULL;
p->nextsibling=NULL;
很好,现在我们需要的元素都有了。接下来,只要替换邻接表中的元素就完成了:
typedef struct CSNode