//Traverse the graph from vertex v void GraphAdjArray::DFSTree(int v, PCSTreeNode t, bool* visited) { visited[v] = true; bool first = true; CSTreeNode *p = NULL, *q = NULL; int w; for(w = FirstAdjVertex(v); w >= 0; w = NextAdjVertex(v, w)) { if(visited[w]) { continue; } p = new CSTreeNode(&vexs[w]); if(first) { t->firstchild = p; first = false; } else { assert(q != NULL); q->nextsibling = p; } q = p; DFSTree(w, p, visited); } }
/** * 这个函数的作用是从第V个顶点出发深度优先遍历图G,建立以T为根的生成树 * 深度优先遍历 */ void MGraphAL::DFSTree(int v, CSNode *r, bool *visited) { visited[v] = true; //把当前节点访问掉 //设定一个标志,用来确定是不是第一个t下面第一个子树 bool first = true; CSNode *q = nullptr; //访问的当前顶点是否有联通量 if (vertices[v].firstarc == nullptr) return; for (ArcNode *w = vertices[v].firstarc; w != nullptr; w = w->nextarc) { //首先查看这个节点是否已经被查看 if (!visited[w->adjvex]) { CSNode *p = new CSNode(); p->name = vertices[w->adjvex].name; //看看是不是第一次访问 if (first) { //如果是这个顶点的开始的第一个节点,那么就作为节点的孩子节点 r->firstchild = p; first = false; q = r; //那么我们的指针q指向我们的前面的父节点 }//if else { //邻接矩阵的第一个节点是我们的孩子节点,其他的节点是这个孩子节点的兄弟节点 q->nextSibling = p; }//else //q = p; DFSTree(w->adjvex, p, visited); }//if }//for }
void GraphAdjArray::DFSForest(PCSTreeNode* t) { if(vexnum <= 0) { return; } bool* visited = new bool[vexnum]; memset(visited, 0, sizeof(bool) * vexnum); CSTreeNode *p = NULL, *q = NULL; for(int v = 0; v < vexnum; v++) { if(visited[v]) { continue; } p = new CSTreeNode(&vexs[v]); if(*t == NULL) { *t = p; } else { assert(q != NULL); q->nextsibling = p; } q = p; DFSTree(v, p, visited); } delete []visited; }
void DFSTree(ALGraph G,int v,CSTree *T) { /* 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 */ Boolean first=TRUE; int w; CSTree p,q; VertexType v1,w1; visited[v]=TRUE; strcpy(v1,*GetVex(G,v)); for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w)))) /* w依次为v的邻接顶点 */ if(!visited[w]) /* w顶点不曾被访问 */ { p=(CSTree)malloc(sizeof(CSNode)); /* 分配孩子结点 */ strcpy(p->data,*GetVex(G,w)); p->firstchild=NULL; p->nextsibling=NULL; if(first) { /* w是v的第一个未被访问的邻接顶点 */ (*T)->firstchild=p; first=FALSE; /* 是根的第一个孩子结点 */ } else /* w是v的其它未被访问的邻接顶点 */ q->nextsibling=p; /* 是上一邻接顶点的兄弟姐妹结点 */ q=p; DFSTree(G,w,&q); /* 从第w个顶点出发深度优先遍历图G,建立子生成树q */ } }
void DFSTree(ALGraph G,int v,CSTree &T) { // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 Boolean first=TRUE; int w; CSTree p,q; VertexType v1,w1; visited[v]=TRUE; strcpy(v1,GetVex(G,v)); for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,GetVex(G,w)))) // w依次为v的邻接顶点 if(!visited[w]) // w顶点不曾被访问 { p=(CSTree)malloc(sizeof(CSNode)); // 分配孩子结点 strcpy(p->data,GetVex(G,w)); p->firstchild=NULL; p->nextsibling=NULL; if(first) { // w是v的第一个未被访问的邻接顶点 T->firstchild=p; first=FALSE; // 是根的第一个孩子结点 } else // w是v的其它未被访问的邻接顶点 q->nextsibling=p; // 是上一邻接顶点的兄弟姐妹结点 q=p; DFSTree(G,w,q); // 从第w个顶点出发深度优先遍历图G,建立子生成树q } }
/** * 算法7.7,建立无向图G的深度优先生成森林的孩子兄弟链表 */ Status DFSForst(ALGraph G, CSTree &T, bool visited[]) { int v; CSTree p, q; T = NULL; for (v = 0; v < G.vexnum; v++) { visited[v] = false; } for (v=0; v < G.vexnum; v++) { if (!visited[v]) { p = (CSTree) malloc (sizeof(CSNode)); if (!p) return ERROR; p->data = GetVex(G, v); p->lchild = NULL; p->nextsibling = NULL; if (!T) { //是第一棵生成树的根 T = p; } else { q->nextsibling = p; } q = p; DFSTree(G, v, p, visited); } } return OK; }
/** * 算法7.8,从第v个顶点出发深度优先遍历图G,建立以T为根的生成树 */ Status DFSTree(ALGraph G, int v, CSTree T, bool visited[]) { bool first; CSTree p, q; int w; visited[v] = true; first = true; for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) { if (!visited[w]) { p = (CSTree) malloc (sizeof(CSNode)); //分配孩子结点 if (!p) { return ERROR; } p->data = GetVex(G, w); p->lchild = NULL; p->nextsibling = NULL; if (first) { T->lchild = p; first = false; } else { q->nextsibling = p; } q = p; DFSTree(G, w, q, visited); } } return OK; }
void DFSForest(ALGraph G, CSTree &T) { // 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 CSTree p, q; //孩子兄弟树p、q int v; T = NULL; for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; // 赋初值 for (v=0; v<G.vexnum; ++v) // 从第0个顶点找起 if (!visited[v]) // 第v个顶点不曾被访问 { // 第v顶点为新的生成树的根结点 p = (CSTree) malloc(sizeof (CSNode)); // 分配根结点 p->data=GetVex(G, v); //当前顶点(第v个)拷贝到新分配的根结点 p->firstchild = NULL; p->nextsibling = NULL; if (!T) // 如果孩子兄弟树T为空,表示是第一棵生成树的根(T的根) T = p; //所以T取新分配的根结点 else // 如果孩子兄弟树T不为空,表示是其它生成树的根(前一棵的根的“兄弟”) q->nextsibling = p; //令前一棵的根的“兄弟”取新分配的根结点 q = p; // q取当前生成树的根 DFSTree(G, v, p); // 从第v顶点出发建立以p为根的生成树 } }
void DFSForest(ALGraph G,CSTree &T) { // 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 CSTree p,q; int v; T=NULL; for(v=0;v<G.vexnum;++v) visited[v]=FALSE; // 赋初值,visited[]在bo7-2.cpp中定义 for(v=0;v<G.vexnum;++v) // 从第0个顶点找起 if(!visited[v]) // 第v个顶点不曾被访问 { // 第v顶点为新的生成树的根结点 p=(CSTree)malloc(sizeof(CSNode)); // 分配根结点 strcpy(p->data,G.vertices[v].data); p->firstchild=NULL; p->nextsibling=NULL; if(!T) // 是第一棵生成树的根(T的根) T=p; else // 是其它生成树的根(前一棵的根的"兄弟") q->nextsibling=p; // 第1次不通过此处,以后q已赋值 q=p; // q指示当前生成树的根 DFSTree(G,v,p); // 建立以p为根的生成树 } }
void DFSForest(Graph G, CSTree &T) { CSTree p, q; int v; T = NULL; for (v = 0; v < G.vexnum; ++v) visited[v] = FALSE; for (v = 0; v < G.vexnum; ++v) if (!visited[v]) { p = (CSTree)malloc(sizeof(CSNode)); p->data = GetVex(G, v); p->firstchild = NULL; p->nextsibling = NULL; if (!T) T = p; else q->nextsibling = p; q = p; DFSTree(G, v, p); } }
void DFSForest(ALGraph G,CSTree *T) { /* 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 */ CSTree p,q; int v; *T=NULL; for(v=0;v<G.vexnum;++v) visited[v]=FALSE; /* 赋初值 */ for(v=0;v<G.vexnum;++v) /* 从第0个顶点找起 */ if(!visited[v]) { /* 第v顶点为新的生成树的根结点 */ p=(CSTree)malloc(sizeof(CSNode)); /* 分配根结点 */ strcpy(p->data,*GetVex(G,v)); p->firstchild=NULL; p->nextsibling=NULL; if(!*T) /* 是第一棵生成树的根(T的根) */ *T=p; else /* 是其它生成树的根(前一棵的根的"兄弟") */ q->nextsibling=p; q=p; /* q指示当前生成树的根 */ DFSTree(G,v,&p); /* 建立以p为根的生成树 */ } }
void DFSTree(ALGraph G,int v,CSTree &T) { // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 Boolean first=TRUE; int w; CSTree p,q; visited[v]=TRUE; for(w=FirstAdjVex(G,G.vertices[v].data);w>=0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data)) // w依次为v的邻接顶点 if(!visited[w]) // w顶点不曾被访问 { p=(CSTree)malloc(sizeof(CSNode)); // 分配孩子结点 strcpy(p->data,G.vertices[w].data); p->firstchild=NULL; p->nextsibling=NULL; if(first) { // w是v的第一个未被访问的邻接顶点 T->firstchild=p; first=FALSE; // 是根的第一个孩子结点 } else // w是v的其它未被访问的邻接顶点 q->nextsibling=p; // 是上一邻接顶点的兄弟姐妹结点(第1次不通过此处,以后q已赋值) q=p; DFSTree(G,w,q); // 从第w个顶点出发深度优先遍历图G,建立子生成树q } }
void DFSTree(Graph G, int v, CSTree &T) { Boolean first = TRUE; int w; CSTree p, q; visited[v] = TRUE; for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) if (!visited[w]) { p = (CSTree)malloc(sizeof(CSNode)); p->data = GetVex(G, w); p->firstchild = NULL; p->nextsibling = NULL; if (first) { T->firstchild = p; first = FALSE; } else { q->nextsibling = p; } q = p; DFSTree(G, w, q); } }
void DFSTree(ALGraph G, int v, CSTree &T) { // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 Boolean first = TRUE; int w; CSTree p, q; //孩子兄弟树p、q VertexType v1, w1; visited[v] = TRUE; v1=GetVex(G, v); //顶点v1序号为v // w依次为v的邻接顶点 //w初始化为v1第一个邻接点序号 //只要w大于等于0,就执行循环体 //循环体完毕,w取v1的(相对于w1(序号w)的)下一个邻接顶点的序号,准备下轮循环 for (w=FirstAdjVex(G,v1); w>=0; w=NextAdjVex(G,v1,w1=GetVex(G,w))) if (!visited[w]) // w顶点不曾被访问 { p = (CSTree) malloc(sizeof (CSNode)); // 分配新孩子结点 p->data=GetVex(G, w); //v的当前邻接顶点复制到新结点 p->firstchild = NULL; p->nextsibling = NULL; if (first) // w是v的第一个未被访问的邻接顶点 { T->firstchild = p; //树T的长子取新结点 first = FALSE; // 长子标志置假 } else // w是v的其它未被访问的邻接顶点,是上一邻接顶点的兄弟结点 q->nextsibling = p; // 上一邻接顶点的兄弟结点取新结点 q = p; //q取新结点 DFSTree(G, w, q); // 从第w个顶点出发深度优先遍历图G,递归建立以q为根的子生成树 } }