`

图的深度优先遍历 邻接表(头结点边结点)

阅读更多

8.3.1深度优先搜索遍历

 

  图的深度优先搜索遍历类似于二叉树的深度优先搜索遍历。其基本思想如下:假定以图中某个顶点Vi为出发点,首先访问出发点,然后选择一个Vi的未访问过的邻接点Vj,以Vj为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。显然,这是一个递归的搜索过程。

 

  现以图8.15为例说明深度优先搜索过程。假定V1是出发点,首先访问V1。因V1有两个邻接点V2、V3均末被访问过,可以选择V2作为新的出发点,访问V2之后,再找V2的末访问过的邻接点。同V2邻接的有V1、V4和V5,其中V1已被访问过,而V4、V5尚未被访问过,可以选择V4作为新的出发点。重复上述搜索过程,继续依次访问V8、V5 。访问V5之后,由于与V5相邻的顶点均已被访问过,搜索退回到V8,访问V8的另一个邻接点V6。接下来依次访问V3和V7,最后得到的的顶点的访问序列为:V1 → V2 → V4 → V8 → V5 → V6 → V3 → V7。

 

package abc.graph;

import java.util.ArrayList;
import java.util.List;

public class AlGraph {
	
	List<HeadNode> headNodes = new ArrayList<HeadNode>();
	
	void addVertex(HeadNode node) {
		headNodes.add(node);
	}
	
	void addArc(HeadNode head, HeadNode tail) {
		if(head.firstArcNode == null)
			head.firstArcNode = new ArcNode(tail);
		else {
			ArcNode arcNode = head.firstArcNode;
			while (arcNode.nextArcNode != null) {
				arcNode = arcNode.nextArcNode;
			}
			arcNode.nextArcNode = new ArcNode(tail);
		}
	}
	
	public void DFSTraverse() {
		InitVisited();
		DFS(headNodes.get(0));
	}
	private void DFS(HeadNode node) {
		node.isVisited = true;
		System.out.print(node.name);
		System.out.print(" -> ");
		
		ArcNode arcNode = node.firstArcNode;
		while(arcNode != null) {
			if(arcNode.headNode.isVisited != true)
				DFS(arcNode.headNode);
			arcNode = arcNode.nextArcNode;
		}
	}
	
	private void InitVisited() {
		for(HeadNode node : headNodes) {
			node.isVisited = false;
		}
	}
	
	static AlGraph createAlGraph() {
		AlGraph alGraph = new AlGraph();
		
		HeadNode V1 = new HeadNode("V1");
		HeadNode V2 = new HeadNode("V2");
		HeadNode V3 = new HeadNode("V3");
		HeadNode V4 = new HeadNode("V4");
		HeadNode V5 = new HeadNode("V5");
		HeadNode V6 = new HeadNode("V6");
		HeadNode V7 = new HeadNode("V7");
		HeadNode V8 = new HeadNode("V8");
		
		
		alGraph.addVertex(V1);
		alGraph.addVertex(V2);
		alGraph.addVertex(V3);
		alGraph.addVertex(V4);
		alGraph.addVertex(V5);
		alGraph.addVertex(V6);
		alGraph.addVertex(V7);
		alGraph.addVertex(V8);
		
		alGraph.addArc(V1, V2);			alGraph.addArc(V1, V3);
		alGraph.addArc(V2, V1);			alGraph.addArc(V2, V4);	alGraph.addArc(V2, V5);
		alGraph.addArc(V3, V1);			alGraph.addArc(V3, V6);	alGraph.addArc(V3, V7);
		alGraph.addArc(V4, V2);			alGraph.addArc(V4, V8);
		alGraph.addArc(V5, V2);			alGraph.addArc(V5, V8);
		alGraph.addArc(V6, V3);			alGraph.addArc(V6, V8);
		alGraph.addArc(V7, V3);			alGraph.addArc(V7, V8);
		alGraph.addArc(V8, V4);			alGraph.addArc(V8, V5);	alGraph.addArc(V8, V6);	alGraph.addArc(V8, V7);
		
		return alGraph;
	}
	
	void print() {
		for(HeadNode head : headNodes) {
			System.out.print(head.name);
			if(head.firstArcNode != null) {
				ArcNode arcNode = head.firstArcNode;
				System.out.print(" -> ");
				System.out.print(arcNode.headNode.name);
				while (arcNode.nextArcNode != null) {
					arcNode = arcNode.nextArcNode;
					System.out.print(" -> ");
					System.out.print(arcNode.headNode.name);
				}
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		AlGraph.createAlGraph().print();
		System.out.println("\nAlGraph DFSTraverse !!");
		AlGraph.createAlGraph().DFSTraverse();
	}
}

class ArcNode {
	HeadNode headNode;
	ArcNode nextArcNode;
	public ArcNode(HeadNode tail) {
		this.headNode = tail;
	}
}

class HeadNode {
	String name;
	ArcNode firstArcNode;
	boolean isVisited;
	
	HeadNode(String name) {
		this.name = name;
	}
}

 

 

 

输出 写道
V1 -> V2 -> V3
V2 -> V1 -> V4 -> V5
V3 -> V1 -> V6 -> V7
V4 -> V2 -> V8
V5 -> V2 -> V8
V6 -> V3 -> V8
V7 -> V3 -> V8
V8 -> V4 -> V5 -> V6 -> V7

AlGraph DFSTraverse !!
V1 -> V2 -> V4 -> V8 -> V5 -> V6 -> V3 -> V7 ->

 

分享到:
评论

相关推荐

    数据结构第4次作业.docx

    3.编程题: 建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。 4.编程题:建立AOE网络存储结构,计算并输出ve[]和vl[]。 5.选作题*:算法设计-已知AOE网络的邻接表存储结构G,ve[]和vl[]值已全部求取...

    数据结构和算法动画演示

    数据结构和算法Flash动画演示 顺序查找 顺序栈(4个存储空间) 顺序栈(8个存储空间) ...邻接表表示的图的深度优先遍历 拓扑排序 最短路径 克鲁斯卡尔算法构造最小生成树 B树的删除 B树的生长过程

    图邻接表图的遍历等有关操作

    图邻接矩阵的建立,邻接表的建立 图的深度遍历。

    数据结构图的遍历及拓扑排序

    //存放头结点的顺序表 int n,e; //图的顶点数和边数 } linkmap; int v[100]={0}; //深度优先遍历中标记已访问的信息 int dv[100]={0}; //广度优先遍历中标记已访问的信息 /*----------------定义建立图-----------...

    图的深度广度优先算法

    本演示程序中,要求以邻接表作为图的存储结构。图中顶点数据类型为字符型,在提示信息下由用户输入。边的信息由用户输入弧头和弧尾元素。 &lt;br&gt; 为实现上述程序功能,以线性链表表示集合。为此,需要两个抽象...

    数据结构和算法Flash动画演示

    一些算法的 flash动画演示:B树的删除,B树的...规并排序,邻接表表示的图的广度优先遍历,邻接表表示的图的深度优先遍历,顺序查找,顺序栈(4个存储空间),顺序栈(8个存储空间),顺序表的删除运算,顺序队列操作。

    【swjtu】数据结构第4次作业.docx

    2. 写算法 (1) 二叉树的直径定义为从根结点至叶子的最大路径长度。...1. 编程题: 建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。 2. 编程题:建立AOE网络存储结构,计算并输出ve[]和vl[]。

    Flash动画演示 数据结构和算法

    B树的删除.swf B树的生长过程.swf ...邻接表表示的图的深度优先遍历.swf 顺序查找.swf 顺序栈(4个存储空间).swf 顺序栈(8个存储空间).swf 顺序表的删除运算.swf 顺序表的插入.swf 顺序队列操作.swf

    数据结构动画演示学习工具SWF.zip

    树的删除.swfB树的生成.swf查找中序线索二叉树后继.swf串的顺序存单链表结点的插入.swf单链表结点的删除.swf堆排序.swf二叉排序树的删除.swf二叉排序树的生成.swf二叉树的建立.swf二分查找.swf分块查找.swf构造...

    西南交通大学-zhy-数据结构第4次作业.docx

    3. 编程题: 建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。 4. 编程题:建立AOE网络存储结构,计算并输出ve[]和vl[]。 5. 选作题*:算法设计-已知AOE网络的邻接表存储结构G,ve[]和vl[]值已全部求...

    吉林大学软件学院2011数据结构实验题C++实现

    第一次实验: 题目1 单链表相关算法的实验验证。...2)图的深度优先遍历的递归算法; 3)图的深度优先遍历的迭代算法; 4)图的广度优先遍历算法。 第四次实验 折半插入排序,堆排序,快速排序 请阅读说明文档

    数据结构(图)试题及答案

    1. 图有 邻接矩阵 、 邻接表 等存储结构,遍历图有 深度优先遍历 、 广度优先遍历 等方法。 2. 有向图G用邻接表矩阵存储,其第i行的所有元素之和等于顶点i的 出度 。 3. 如果n个顶点的图是一个环,则它有 n 棵生成...

    数据结构课程设计(C语言实现)

    设计一个应用程序(C/C++)...5.图的基本操作及应用①创建(邻接矩阵/邻接表)②遍历(深度/广度)③定位④找第一个邻接点⑤找下一个邻接点⑥插入(点/边)⑦删除(点/边)⑧应用,图的应用,如拓扑排序、关键路径等。

    数据结构动画演示

    '构造哈夫曼树过程.swf', '栈与递归.swf', '树、森林和二叉树的转换.swf', '桶式排序法.swf', '直接插入排序.swf', '直接选择排序.swf', '邻接表表示的图的广度优先遍历.swf', '邻接表表示的图的深度优先遍历.swf',...

    东大22春《数据结构Ⅱ》在线平时作业1-00001

    已知含6个顶点(v0,v1,v2,v3,v4,v5)的无向图的邻接矩阵如图所示,则从顶点v0出发进行深度优先遍历可能得到的顶点访问序列为5.n个顶点的有向完全图中含有向边的数目最多为6.在以单链表为存储结构的线性表中,数据...

    c_数据结构_图的相关操作

    void DFS AdjList g int vi 对邻接表G从顶点vi开始进行深度优先遍历 { ArcNode p; printf &quot;下标%d结点%3s &gt;&quot; vi g &gt;adjlist[vi] data ; 访问vi顶点 visited[vi] 1; 置已访问标识 p g ...

    数据结构课程设计

    要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的广度优先搜索遍历路径。 查找 设计一个读入...

    数据结构(C++)有关练习题

    2、 针对带附加头结点的单链表,试编写下列函数: A. 定位函数Locate:在单链表中寻找第i个结点。若找到,则函数返回第i个结点的地址;若找不到,则函数返回NULL; B. 球最大值函数max:通过单链表的一...

    南理工初试试题

    3)(3分)画出该图邻接表存储结构示意图。 4)(3分)画出对应无向图的最小生成树,给出生成树边权之和。(如果去掉方向后,一对顶点之间有两条以上的边,只保留权值最小的边) 2.已知关键字的集合{56,8,15,80,10...

    c语言数据结构算法演示(Windows版)

    窗口下方显示图的邻接表,演示过程中以红色框边表示已访问过的弧。图示窗口的下方显示遍历后输出的顶点序列。 22. 图的广度优先搜索 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 ...

Global site tag (gtag.js) - Google Analytics