【数据结构】图的深度优先遍历DFS之java实现

#课堂上老师给出的思路
在这里插入图片描述

#示例:
在这里插入图片描述

#代码及结果

public class T1_12_2021 {
	public int nodeNum;	//结点数量
	public int edgeNum;	//边的数量
	public int node[]=new int[9];	//邻接矩阵的点
	public int edge[][]= new int[9][9];//邻接矩阵的边的集合
	public boolean visited[]=new boolean[9];
	
	public T1_12_2021()
	{
		nodeNum=9;
		edgeNum=10;
		//初始化结点
		for(int i=0;i<nodeNum;i++)
		{
			node[i]=i+1;
			visited[i]=false;
		}
		//初始化边
		edge[0][1]=edge[1][0]=1;
		edge[0][2]=edge[2][0]=1;
		edge[1][3]=edge[3][1]=1;
		edge[1][4]=edge[4][1]=1;
		edge[3][7]=edge[7][3]=1;
		edge[4][7]=edge[7][4]=1;
		edge[7][8]=edge[8][7]=1;
		edge[2][5]=edge[5][2]=1;
		edge[2][6]=edge[6][2]=1;
		edge[5][6]=edge[6][5]=1;
	}
	
	//输出图
	public void printGraph()
	{
		System.out.print("该图输出为:\n  ");
		for(int i=0;i<nodeNum;i++)
		{
			System.out.print(node[i]+" ");
		}
		System.out.println();
		for(int i=0;i<nodeNum;i++)
		{
			System.out.print(node[i]+" ");
			for(int j=0;j<nodeNum;j++)
			{
				System.out.print(edge[i][j]+" ");
			}
			System.out.println();
		}
		System.out.println();
	}
	
	public void DFS(int v)
	{//表示从顶点v开始深度遍历
		int i,w;
		i=LocateVex(v);//获取顶点v的序号
		if(visited[i]==false)
		{//如果顶点v没有被访问过
			System.out.print(node[i]+" ");
			visited[i]=true;
		}
		w=FirstAdjVex(v);//寻找结点v的第一个邻接节点的序号
		while(w>0)
		{
			if(visited[w]==false)
			{//如果序号为w的结点没有被访问
				DFS(node[w]);
			}
			w=NextAdjVex(v,w);//获得图中v顶点的序号为w的邻接顶点之后的下一个顶点的序号
		}
	}
	
	public int NextAdjVex(int v,int w)
	{//获得图中v顶点的序号为w的邻接顶点之后的下一个顶点的序号
		int j=LocateVex(v);
		for(int i=w+1;i<nodeNum;i++)
		{
			if(edge[j][i]!=0)
				return i;
		}
		return -1;
	}
	
	public int FirstAdjVex(int v)
	{//寻找结点v的第一个邻接节点的序号
		int j=LocateVex(v);
		for(int i=0;i<nodeNum;i++)
		{
			if(edge[j][i]!=0 && visited[i]==false)
				return i;
		}
		return -1;
	}
	
	public int LocateVex(int v)
	{
		int pos=-1;
		for(int i=0;i<nodeNum;i++)
		{
			if(node[i]==v)
			{
				pos=i;
				return pos;
			}
		}
		return pos;
	}
		
	public static void main(String args[])
	{
		 T1_12_2021 m=new T1_12_2021();
		 m.printGraph();
		 m.DFS(1);
	}

}

最终结果为:1 2 4 8 5 9 3 6 7
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值