图遍历的介绍
/*图的深度优先遍历与树的广度优先遍历*/
#include
#include
#define k 100
int visited[k]={0},visitedd[k]={0};
typedef struct node{int adjvex;
struct node *next;
}node;
typedef struct {char a;
node *first;
}list;
typedef struct {list vextes[k];
int n,e;
}adjgraph;
void creat(adjgraph *g)
{int i,j,w;node *p;
printf("input n,e;
");
scanf("%d%d",&g->n,&g->e);
getchar();
for(i=0;in;i++)
{scanf("%c",&g->vextes[i].a);
g->vextes[i].first=NULL;
}
for(i=0;ie;i++)
{scanf("%d%d",&j,&w);
p=(node*)malloc(sizeof(node));
p->adjvex=j;
p->next=g->vextes[w].first;
g->vextes[w].first=p;
p=(node*)malloc(sizeof(node));
p->adjvex=w;
p->next=g->vextes[j].first;
g->vextes[j].first=p;
}
}
void print(adjgraph g)
{int i;node *p;
for(i=0;i<g.n;i++)
{printf("%c",g.vextes[i].a);
p=g.vextes[i].first;
while(p)
{printf("->%d",p->adjvex);
p=p->next;
}
printf("
");
}
}
void visit1(adjgraph g,int i) /*深度优先*/
{node *p;
p=g.vextes[i].first;
visited[i]=1;printf("%c",g.vextes[i]);
while(p)
{if(visited[g.vextes[i].first->adjvex]!=1)visit1(g,g.vextes[i].first->adjvex);
p=p->next;
}
}
void dfs(adjgraph g)
{int i;
for(i=0;i<g.n;i++)
if(!visited[i])visit1(g,i);
}
void visit2(adjgraph g,int i)/*广度优先*/
{node *p;int stack[k];int top=-1;
visitedd[i]=1;printf("%c",g.vextes[i]);
p=g.vextes[i].first;
while(p||top>-1)
{while(p)
{if(visitedd[p->adjvex]!=1){stack[++top]=p->adjvex;
visitedd[p->adjvex]=1;
printf("%c",g.vextes[p->adjvex]);
}
p=p->next;
}
if(top>-1)
p=g.vextes[stack[top--]].first;
}
}
void bfs(adjgraph g)
{int i;
for(i=0;i<g.n;i++)
if(!visitedd[i])visit2(g,i);
}
void main()
{adjgraph g;
creat(&g);
printf("the adjgraph is ;
");
print(g);
printf("
");
dfs(g);
printf("
");
bfs(g);
getch();
}
以前写的两个
先粘把
我可一分也没了
#include"iostream"
#include"malloc.h"
using namespace std;
#define MaxVertexNum 50 //定义最大顶点数
typedef struct node{ //边表结点
char adjvex; //邻接点域
struct node *next; //链域
}EdgeNode;
typedef struct vnode{ //顶点表结点
char vertex; //顶点域
EdgeNode *firstedge; //边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct {
AdjList adjlist; //邻接表
int n,e; //图中当前顶点数和边数
} ALGraph; //图类型
// 建立图的邻接表
void CreatALGraph(ALGraph *G)
{
int i,j,k;
char a;
EdgeNode *s; //定义边表结点
cout<<"请输入顶点数和边数: ";
cin>>i;cin>>j; //读入顶点数和边数
G->n=i;G->e=j;
cout<<"请输入顶点编号:";
for(i=0;in;i++) //建立边表
{
cin>>a;
G->adjlist[i].vertex=a; //读入顶点信息
G->adjlist[i].firstedge=NULL; //边表置为空表
}
cout<<"请输入由两个顶点构成的边,示例:0 1"<<endl;
for(k=0;ke;k++)
{ //建立边表
cin>>i;cin>>j; //读入边(Vi,Vj)的顶点对序号
s=(EdgeNode *)malloc(sizeof(EdgeNode)); //生成边表结点
s->adjvex=j; //邻接点序号为j
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s; //将新结点*S插入顶点Vi的边表头部
s=(EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex=i; //邻接点序号为i
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s; //将新结点*S插入顶点Vj的边表头部
}
}
//定义标志向量为全局变量
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];
// DFS:深度优先遍历的递归算法
void DFSM(ALGraph *G,int i)
{ //以Vi为出发点对邻接链表表示的图G进行DFS搜索
EdgeNode *p;
coutadjlist[i].vertex; //访问顶点Vi
visited[i]=TRUE; //标记Vi已访问
p=G->adjlist[i].firstedge; //取Vi边表的头指针
while(p) { //依次搜索Vi的邻接点Vj,这里j=p->adjvex
if(! visited[p->adjvex]) //若Vj尚未被访问
DFSM(G,p->adjvex); //则以Vj为出发点向纵深搜索
p=p->next; //找Vi的下一个邻接点
}
}
void DFS(ALGraph *G)
{
for(int i=0;in;i++)
visited[0]=FALSE; //标志向量初始化
for(int i=0;in;i++)
if(!visited[0]) //Vi未访问过
DFSM(G,0); //以Vi为源点开始DFS搜索
}
//广度优先遍历
void BFS(ALGraph *G)
{
int k=0; /*以Vk为源点对用邻接链表表示的图G进行广度优先搜索*/
int i,f=0,r=0;
EdgeNode *p;
int cq[MaxVertexNum]; //定义FIFO队列
for(i=0;in;i++)
visited[i]=FALSE; //标志向量初始化
for(i=0;in;i++)
cq[i]=-1; //初始化标志向量
coutadjlist[k].vertex; //访问源点Vk
visited[k]=TRUE;
cq[r]=k; //Vk已访问,将其入队。注意,实际上是将其序号入队
while(cq[f]!=-1) { //队列非空则执行
i=cq[f]; f=f+1; //Vi出队
p=G->adjlist[i].firstedge; //取Vi的边表头指针
while(p) { //依次搜索Vi的邻接点Vj(令p->adjvex=j)
if(!visited[p->adjvex]) { //若Vj未访问过
coutadjlist[p->adjvex].vertex; //访问Vj
visited[p->adjvex]=TRUE;
r=r+1; cq[r]=p->adjvex; //访问过的Vj入队
}
p=p->next; //找Vi的下一个邻接点
}
}
}
int main()
{
int i,x;
ALGraph *G;
G=(ALGraph *)malloc(sizeof(ALGraph));
CreatALGraph(G);
cout<<"遍历结果与构造边的顺序有关。"<<endl;
cout<<"深度优先 "<<endl;
DFS(G);
cout<<endl;
cout<<"广度优先"<<endl;
BFS(G);
cout<<endl;
}
图遍历,别称是图的遍历,是指数据结构中的内容。
后序遍历的介绍
后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。
什么是先、中、后根遍历?什么是左子树、右子树和二叉树?
1、先根遍历一般是先序遍历(Pre-order),按照根左右的顺序沿一定路径经过路径上所有的结点。在二叉树中,先根后左再右。巧记:根左右。首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。例如,下图所示...
Go中字符串的遍历
首先说一下go中的字符串类型:字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。下面介绍字符串的三种遍历方式,根据实际情况选择即可。该遍历方式==缺点==:遍历是按照字节遍历,因此如果有中文等非英文字符,就会...
后根遍历的介绍
后序遍历是二叉树遍历的一种。后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。后序遍历有递归算法和非递归算法两种。
中序遍历的介绍
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游,可记做左根右。
Python字典(dict )的几种遍历方式
本文介绍Python字典(dict)的几种遍历方式。首先,可以使用 for key in dict 遍历字典中所有的键。通过这种方式,能够获取字典中的每个键进行操作。其次,字典提供了 keys() 方法,能够返回字典中所有的键。通过 for key in dict.keys() 的方式,即可遍历这些键。接着,字典还提供了 values() 方法...
关于冯.诺依曼的介绍?
约翰·冯·诺依曼出生于匈牙利的美国籍犹太人数学家,现代电子计算机与博弈论的重要创始人,在泛函分析、遍历理论、几何学、拓扑学和数值分析等众多数学领域及计算机学、量子力学和经济学中都有重大贡献。冯·诺伊曼从小就以过人的智力与记忆力而闻名。冯·诺伊曼一生中发表了大约150篇论文,其中有60篇纯数学...
扩展先序遍历序列的介绍
扩展先序遍历序列是大学计算机基础课程《数据结构与算法 C语言描述》中的内容,在其中的树这一节中,详细地介绍了二叉树的先序遍历二叉树、中序遍历二叉树、后序遍历二叉树的方法,对于一个给定的二叉树,用上述三种方法遍历此二叉树得到的序列是唯一的,也是一一对应的;但是为了在程序中更有效和直观地...
图遍历算法之DFS\/BFS
图遍历即以特定方式访问图中所有节点,给定节点下有多种可能的搜索路径。假定以顺序方式进行(非并行),还未访问的节点就需通过堆栈(LIFO)或队列(FIFO)规则来确定访问先后。由于树结构是一种递归的数据结构,在清晰的定义下,未访问节点可存储在调用堆栈中。本文介绍了图遍历领域最流行的广度优先搜索...
写出二叉树的先序遍历、中序遍历、后序遍历。
一、先序遍历:1、访问根节点 2、前序遍历左子树 3、前序遍历右子树 二、中序遍历:1、中序遍历左子树 2、访问根节点 3、中序遍历右子树 三、后序遍历:1、后序遍历左子树 2、后序遍历右子树 3、访问根节点 下面介绍一下例子与方法:1、画树求法:第一步,根据前序遍历的特点,我们知道根...
驷关力基: 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之...
雁山区15629862162: 先序遍历和后序遍历是什么 - ?
驷关力基: 1、先序遍历也叫做先根遍历、前序遍历,可记做根左右(二叉树父结点向下先左后右).首先访问根结点然后遍历左子树,最后遍历右子树.在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返...
雁山区15629862162: 图的矩阵深度和广度遍历算法 - ?
驷关力基: 图的遍历是指从图中任一给定顶点出发,依次访问图中的其余顶点.如果给定的图是连通图,则从图中的任意一点出发,按照一个指定的顺序就可以访问到图中的所有顶点,且每个顶点只访问一次.这个过程称为图的遍历.图的遍历比树的遍...
雁山区15629862162: 图遍历的算法 - ?
驷关力基: 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个...
雁山区15629862162: 图的深度优先遍历的结果是不固定吗? - ?
驷关力基: 图的遍历概念 1、图的遍历和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问.它是许多图的算法的基础.深度优先遍历和广度优先遍历是最为重要的两种遍历图的方法.它们对无向...
雁山区15629862162: C语言图的创建和遍历算法,紧急 - ?
驷关力基: 图的遍历是指按某条搜索路径访问图中每个结62616964757a686964616fe59b9ee7ad9431333332626161点,使得每个结点均被访问一次,而且仅被访问一次.图的遍历有深度遍历算法和广度遍历算法,最近阿杰做了关于图的遍历的算法,下...
雁山区15629862162: 图的遍历 数据结构 - ?
驷关力基: 你前面一个说的遍历全图所有的点,这个就是属于图的周游,常见算法有:(1)深度优先搜索DFS;(2)广度优先搜索. 后面一个求最短路径,就涉及到了最短路径的问题,但是一般指的是选定的两个点,而不用考虑遍历全图,常见的算法有Dijkstra和Floyd算法.本质需要遍历所有的顶点并使得边的权重最小,这个是属于最小支撑树MST;但是这个里面不要求从每个顶点出发,然后回去.
雁山区15629862162: 数据结构中"遍历"是什么意思? - ?
驷关力基: 所谓遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 扩展资料: 树的遍历是树的一种重要的运...
雁山区15629862162: 数据结构 图的遍历演示.c++语言 - ?
驷关力基: 程序编程如下:#include#define INFINITY 32767 #define MAX_V 20 //最多顶点个数 #define QUEUE_SIZE (MAX_V+1) //队列长度 using namespace std; bool *visited; //访问标志数组 typedef struct //图的邻接矩阵存储结构 { char *vexs; //顶点向...