JAVA数据结构--图的遍历

JAVA数据结构–邻接矩阵图的遍历

深度优先遍历
在这里插入图片描述
遍历顺序:1==》0==》3==》2
从这图上看,可以看出DSF是一个递归的方法。

邻接矩阵图DFS完整代码:

	public int getFirstNeibor(String name) {//获取第一个邻接顶点,参数为顶点名字
		int index = findByName(name);//获取顶点名称对应的下标
		for (int i = 0; i < numOfVertex; i++) {//在邻接矩阵顶点对应的列寻找第一条可通的边
			if (Edge[index][i] < MAX) {//权重小于无穷大,返回此边对应终点顶点下标
				return i;
			}
		}
		return -1;//不存在邻接顶点,返回-1
	}

	public int getNextNeibor(String goal, String pre) {//获取下一个邻接顶点,参数:goal:当前遍历顶点,即寻找goal的下一个邻接顶点。
	//pre:上一个邻接顶点,即从上一个已经被遍历的顶点开始寻找下一个顶点
		int G = findByName(goal);//获取顶点goal的下标
		int P = findByName(pre);
		for (int i = P + 1; i < numOfVertex; i++) {//从P+1开始寻找,即上一个被遍历过的邻接顶点的下一个位置开始寻找
			if (Edge[G][i] < MAX) {//若小于无穷大,返回该邻接顶点下标
				return i;
			}
		}
		return -1;
	}

	public void DFS(String name) {
		System.out.print(name + "-->");//打印输出

		int v = findByName(name);//开始遍历顶点坐标
		isVisit[v] = true;//当前遍历顶点变成true,表示已被遍历过

		int i = getFirstNeibor(name);//获取第一个邻接顶点
		while (i != -1) {
			if (!isVisit[i]) {//未被访问,深度遍历该顶点
				DFS(Vertex[i]);
			}
			i = getNextNeibor(name, Vertex[i]);//获取下一个顶点,若没有,跳出循环返回上一层递归,即返回上一节点
			//存在下一个邻接顶点,则对该邻接顶点进行DSF
		}
	}

测试代码


public class Main {
	public static void main(String[] args) {
		Graph g = new Graph(20);
		g.insertVertex("A");
		g.insertVertex("B");
		g.insertVertex("C");
		g.insertVertex("D");
		g.insertVertex("E");
		g.insertEdge("A", "B", 2);
		g.insertEdge("A", "C", 5);
		g.insertEdge("A", "D", 1);
		g.insertEdge("C", "D", 1);
		g.insertEdge("C", "B", 3);
		g.insertEdge("D", "E", 9);
		g.insertEdge("E", "B", 10);
		g.insertEdge("E", "C", 1);
		g.DFS("A");
	}
}

测试结果
在这里插入图片描述

广度优先遍历
在这里插入图片描述
遍历顺序:1==》0==》3==》2

	public void BFS(String name) {
		System.out.print(name + "-->");//输出顶点名
		Queue<String> queue = new LinkedList<String>();
//findByName(String name)是通过顶点名称返回顶点在矩阵中的对应下标
		int v = findByName(name);//获取起始顶点名下标

		isVisit[v] = true;//是初始顶点变为访问过

		queue.add(name);//加入队列,作为第一个访问顶点

		while (!queue.isEmpty()) {//队列空时,即无下一遍历顶点,退出循环
			int v1 = findByName(queue.poll());//取队头,作为当前访问顶点
			int v2 = getFirstNeibor(Vertex[v1]);//获取第一个

			while (v2 != -1) {//若无邻接顶点,结束循环

				if (!isVisit[v2]) {//邻接顶点是否被访问过
					System.out.print(Vertex[v2] + "-->");
					isVisit[v2] = true;//将此顶点归为访问过
					queue.add(Vertex[v2]);//此顶点加入队列,作为下一层循环的开始顶点
				}

				v2 = getNextNeibor(Vertex[v1], Vertex[v2]);//获取当前顶点的下一邻接顶点
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值