您的位置:首页 > 编程语言 > Java开发

Java图的遍历(深度优先遍历、广度优先遍历)

2017-05-05 19:50 447 查看


以上为测试图及其邻接矩阵表示,具体代码如下

import java.util.LinkedList;
import java.util.Queue;
/**
* 图的两种遍历方法
* @author QQ 1023507448
*
*/
public class graphTraverse {

private static String[] node; //存储节点编号
private static int[][] arc;   //存储边
private static boolean[] flag;//存储节点是否被访问过

//深度优先遍历
private void depthFirstTraversal()
{
flag = new boolean[node.length];
for( int i=0;i<node.length;i++ )
{
if( !flag[i] )
{
visitByRecursive(i);
}
}
}

//深度优先遍历-递归访问节点
private void visitByRecursive(int i)
{
flag[i] = true; //设置为已访问过
System.out.print(node[i]+" ");//在控制台打印
for( int j=0;j<node.length;j++ )
{
if( !flag[j] && arc[i][j]==1 )
{
visitByRecursive(j);//递归
}
}

}

//广度优先遍历
private void breadthFirstTraversal ()
{
Queue<Integer> qu = new LinkedList<Integer>();
/*Queue是接口,只能new一个它的实现类,
LinkedList实现了Queue */
flag = new boolean[node.length];
for( int i=0;i<node.length;i++ )
{
if( !flag[i] )
{
if(qu.offer(i))//元素入队列
{
flag[i] = true; //设置为已访问过
System.out.print(node[i]+" ");//在控制台打印
}
while( !qu.isEmpty() )//若队列不为空
{
int temp = qu.poll();//出队列并返回值
for( int j=0;j<node.length;j++ )
{
if( !flag[j] && arc[temp][j]==1 )
{
if(qu.offer(j))//元素入队列
{
flag[j] = true; //设置为已访问过
System.out.print(node[j]+" ");//在控制台打印
}
}
}
}
}
}

}

public static void main(String[] args)
{
// TODO Auto-generated method stub
graphTraverse gt = new graphTraverse();
node = new String[]{ "A", "B", "C", "D", "E", "F", "G", "H" };//节点标记
arc = new int[][]
{
//边
{ 0, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 }
};
System.out.println("深度优先搜索");
gt.depthFirstTraversal();//调用深度优先搜索
System.out.println("");
System.out.println("广度优先搜索");
gt.breadthFirstTraversal();//调用广度优先搜索
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息