java实现数据结构图论的广度优先和深度优先遍历算法(附源代码)

java实现数据结构图论的广度优先和深度优先遍历算法(附源代码)

广度优先遍历和深度优先遍历是图论中两个比较重要的遍历算法,下面介绍这两种遍历算法,并用java代码进行实现:
一、深度优先遍历
深度优先遍历有点类似于树中的先序遍历,顺着一条线依次找到相应的节点,此时为了方便,我们往往需要一个额外的标志数组进行标记我们已经访问过得节点
算法步骤:
(1)首先访问出发点V。
(2)然后依次从V出发搜索V的每个邻接点W,若W未曾访问过,则以W为新的出发点继续进行深度优先搜索遍历,直至图中所有和源点V有路径相通的顶点均已被访问为止。
(3)若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。
显然,以上的遍历定义是递归的,其特点是尽可能先对纵深方向进行搜索,故这种搜索方法为深度优先搜索。

	// 图的深度优先遍历
	private void DFS(int i) {
   
   
		System.out.print("顶点:" + i + "  ");
		this.visited[i] = true;
		for (int j = 0; j < this.vexNum; j++) {
   
   
			if (this.adj.get(i).get(j) == 1 && (!this.visited[j])) {
   
   
				DFS(j);
			}
		}
	}

	public void DFSTraverse() {
   
   
		// 初始化访问信息
		for (int i = 0; i < this.vexNum; i++) {
   
   
			this.visited[i] = false;
		}
		for (int i = 0; i < this.vexNum; i++) {
   
   
			if (!this.visited[i]) {
   
   
				DFS(i);
			}
		}
	}

二、广度优先遍历
广度优先遍历类似于树结构中的层序遍历,因此我们需要用到一个队列结构,因为我们是用邻接矩阵进行的遍历,所以每一个顶点的邻接点,即为相应的一行上值为1所对应的列上的顶点,让这些邻接点依次入队
具体算法步骤:

(1)首先访问出发点V,并将相应的标志位置为true。
(2)接着依次访问顶点V的所有邻接点V1,V2,…,Vt(即该顶点所在行上为1的列上的顶点)。
(3)然后再依次访问顶点V1,V2,…,Vt的所有邻接点。
(4)依次类推,直至图中所有的顶点都被访问到。

// 广度优先遍历
	private void BFS(int i) {
   
   
		Queue<Integer> q = new LinkedList<>();
		System.out.print("顶点:" + i + "  ");
		this.visited[i] = true;;
		q.offer(i);
		while (!q.isEmpty()) {
   
   
			int k = q.poll();
			for (int j = 0; j < this.vexNum; j++) {
   
   
				if (this.adj.get(k).get(j) == 1 && (!this.visited[j])) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值