




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java数据结构之图的原理与实现*深度优先搜索遍历图的递归实现,类似于树的先序遍历
*因此模仿树的先序遍历,同样借用栈结构,这里使用的是方法的递归,隐式的借用栈
*@parami顶点索引
*@paramvisited访问标志数组
privatevoidDFS(inti,boolean[]visited){
//索引索引标记为true,表示已经访问了
visited[i]=true;
System.out.print(vertexs[i].data+"");
//获取该顶点的边表头结点
LNodenode=vertexs[i].firstEdge;
//循环遍历该顶点的邻接点,采用同样的方式递归搜索
while(node!=null){
if(!visited[node.vertex]){
DFS(node.vertex,visited);
node=node.nextEdge;
*深度优先搜索遍历图,类似于树的前序遍历,
publicvoidDFS(){
//新建顶点访问标记数组,对应每个索引对应相同索引的顶点数组中的顶点
boolean[]visited=newboolean[vertexs.length];
//初始化所有顶点都没有被访问
for(inti=0;ivertexs.length;i++){
visited[i]=false;
System.out.println("DFS:");
/*循环搜索*/
for(inti=0;ivertexs.length;i++){
//如果对应索引的顶点的访问标记为false,则搜索该顶点
if(!visited[i]){
DFS(i,visited);
/*走到这一步,说明顶点访问标记数组全部为true,说明全部都访问到了,深度搜索结束*/
System.out.println();
*广度优先搜索图,类似于树的层序遍历
*因此模仿树的层序遍历,同样借用队列结构
publicvoidBFS(){
//辅组队列
QueueIntegerindexLinkedList=newLinkedList();
//新建顶点访问标记数组,对应每个索引对应相同索引的顶点数组中的顶点
boolean[]visited=newboolean[vertexs.length];
//初始化所有顶点都没有被访问
for(inti=0;ivertexs.length;i++){
visited[i]=false;
System.out.println("BFS:");
for(inti=0;ivertexs.length;i++){
//如果访问方剂为false,则设置为true,表示已经访问,然后开始访问
if(!visited[i]){
visited[i]=true;
System.out.print(vertexs[i].data+"");
indexLinkedList.add(i);
//判断队列是否有值,有就开始遍历
if(!indexLinkedList.isEmpty()){
//出队列
Integerj=indexLinkedList.poll();
LNodenode=vertexs[j].firstEdge;
while(node!=null){
intk=node.vertex;
if(!visited[k]){
visited[k]=true;
System.out.print(vertexs[k].data+"");
//继续入队列
indexLinkedList.add(k);
node=node.nextEdge;
System.out.print("\n");
@Override
publicStringtoString(){
StringBuilderstringBuilder=newStringBuilder();
for(inti=0;ivertexs.length;i++){
stringBuilder.append(i).append("(").append(vertexs[i].data).append("):");
LNodenode=vertexs[i].firstEdge;
while(node!=null){
stringBuilder.append(node.vertex).append("(").append(vertexs[node.vertex].data).append(")");
node=node.nextEdge;
if(node!=null){
stringBuilder.append("-
}else{
break;
stringBuilder.append("\n");
returnstringBuilder.toString();
publicstaticvoidmain(String[]args){
//顶点数组添加的先后顺序对于遍历结果有影响
Character[]vexs={'A','B','C','D','E','F','G'};
//边二维数组添加的先后顺序对于遍历结果有影响
Character[][]edges={
{'A','C'},
//对于无向图来说是多余的边关系,在linkLast方法中做了判断,并不会重复添加
{'A','D'},
{'A','D'},
{'D','A'},
{'A','F'},
{'B','C'},
{'C','D'},
{'E','G'},
{'E','B'},
{'D','B'},
{'F','G'}};
//构建图
UndirectedAdjacencyListCharacterundirectedAdjacencyList=newUndirectedAdjacencyList(vexs,edges);
//输出图
System.out.println(undirectedAdjacencyList);
//深度优先遍历
undirectedAdjacencyList.DFS();
//广度优先遍历
undirectedAdjacencyList.BFS();
}
测试无向图对应的逻辑结构如下:
测试图的遍历结果如下:
4.2有向图的邻接表实现
/**
*有向图邻接链表简单实现
*{@linkAdjacencyList#AdjacencyList(E[],E[][])}构建有向图
*{@linkAdjacencyList#DFS()}深度优先遍历有向图
*{@linkAdjacencyList#BFS()}广度优先遍历有向图
*{@linkAdjacencyList#toString()}()}输出有向图
*@authorlx
publicclassAdjacencyListE{
*顶点类
*@paramE
privateclassNodeE{
*顶点信息
Edata;
*指向第一条依附该顶点的边
LNodefirstEdge;
publicNode(Edata,LNodefirstEdge){
this.data=data;
this.firstEdge=firstEdge;
*边表节点类
privateclassLNode{
*该边所指向的顶点的索引位置
intvertex;
*指向下一条弧的指针
LNodenextEdge;
*顶点数组
privateNodeE[]vertexs;
*创建图
*@paramvexs顶点数组
*@paramedges边二维数组
publicAdjacencyList(E[]vexs,E[][]edges){
/*初始化顶点数组,并添加顶点*/
vertexs=newNode[vexs.length];
for(inti=0;ivertexs.length;i++){
vertexs[i]=newNode(vexs[i],null);
/*初始化边表,并添加边节点到边表尾部,即采用尾插法*/
for(E[]edge:edges){
//读取一条边的起始顶点和结束顶点索引值
intp1=getPosition(edge[0]);
intp2=getPosition(edge[1]);
//初始化lnode1边节点即表示p1指向p2的边
LNodelnode1=newLNode();
lnode1.vertex=p2;
//将LNode链接到"p1所在链表的末尾"
if(vertexs[p1].firstEdge==null){
vertexs[p1].firstEdge=lnode1;
}else{
linkLast(vertexs[p1].firstEdge,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨文化团队管理方案计划
- 品牌跨界合作的成功案例分析计划
- 城市交通设施设计重点基础知识点
- 年度奖惩机制的合理设定计划
- 未来计算技术考试考题及答案解析
- 2024年珠海市第三人民医院招聘笔试真题
- 2024年青海省广播电视局下属事业单位真题
- 2024年内江市市中区事业单位招聘工作人员真题
- 2024年西林县交通运输局招聘笔试真题
- 2024年西安市雁塔区第四小学招聘笔试真题
- 全国卷高考标准语文答题卡作文纸3栏800字版
- DB32T 4284-2022 居民住宅二次供水工程技术规程
- 放射性物品道路运输申请表样表
- 110kV变电站高压试验报告完整版
- 山东大学《概率论与数理统计》期末试题及答案
- TSG Z7001-2004 特种设备检验检测机构核准规则
- 入学、幼儿园等健康卫生教育洗手知识教育ppt课件
- JJF(鄂) 82-2021 全自动混凝土抗渗仪校准规范(高清版)
- 流动注射分析仪常见问题解决方案.
- 材料科学基础基础知识点总结
- 数控铣工图纸(60份)(共60页)
评论
0/150
提交评论