图的广度优先遍历 java_用java语言实现图的广度优先遍历和深度优先遍历

import java.util.*;

/**

* 这个例子是图的遍历的两种方式

* 通过它,使我来理解图的遍历

* Created on 2013-11-18

* @version 0.1

*/

public class DeptSearch

{

public static void main(String args[]){

//构造需要点对象

NodeT a=new NodeT("a");

NodeT b=new NodeT("b");

NodeT c=new NodeT("c");

NodeT d=new NodeT("d");

NodeT e=new NodeT("e");

NodeT f=new NodeT("f");

NodeT g=new NodeT("g");

NodeT h=new NodeT("h");

ArcT ab=new ArcT(a,b);

ArcT ac=new ArcT(a,c);

ArcT ad=new ArcT(a,d);

ArcT ah=new ArcT(a,h);

ArcT bc=new ArcT(b,c);

ArcT de=new ArcT(d,e);

ArcT ef=new ArcT(e,f);

ArcT eg=new ArcT(e,g);

ArcT hg=new ArcT(h,g);

//建立它们的关系

a.outgoing.add(ab);

a.outgoing.add(ac);

a.outgoing.add(ad);

a.outgoing.add(ah);

b.outgoing.add(bc);

d.outgoing.add(de);

e.outgoing.add(ef);

e.outgoing.add(eg);

h.outgoing.add(hg);

//构造本对象

DeptSearch search=new DeptSearch();

//广度遍历

System.out.println("广度遍历如下:");

search.widthSearch(a);

//深度遍历

System.out.println("深度遍历如下:");

List visited=new ArrayList();

search.deptFisrtSearch(a,visited);

}

/*

* 深度排序的方法

* 这个方法的方式:按一个节点,一直深入的找下去,直到它没有节点为止

* cur 当前的元素

* visited 访问过的元素的集合

*/

void deptFisrtSearch(NodeT cur,List visited){

//被访问过了,就不访问,防止死循环

if(visited.contains(cur)) return;

visited.add(cur);

System.out.println("这个遍历的是:"+cur.word);

for(int i=0;i

//访问本点的结束点

deptFisrtSearch(cur.outgoing.get(i).end,visited);

}

}

/**

* 广度排序的方法

* 这个方法的方式:按层次对图进行访问,先第一层,再第二层,依次类推

* @param start 从哪个开始广度排序

*/

void widthSearch(NodeT start){

//记录所有访问过的元素

Set visited=new HashSet();

//用队列存放所有依次要访问元素

Queue q=new LinkedList();

//把当前的元素加入到队列尾

q.offer(start);

while(!q.isEmpty()){

NodeT cur=q.poll();

//被访问过了,就不访问,防止死循环

if(!visited.contains(cur)){

visited.add(cur);

System.out.println("查找的节点是:"+cur.word);

for(int i=0;i

//把它的下一层,加入到队列中

q.offer(cur.outgoing.get(i).end);

}

}

}

}

}

/**

* 图的点

*/

class NodeT

{

/* 点的所有关系的集合 */

List outgoing;

//点的字母

String word;

public NodeT(String word){

this.word=word;

outgoing=new ArrayList();

}

}

/**

* 单个图点的关系

*/

class ArcT

{

NodeT start,end;/* 开始点,结束点 */

public ArcT(NodeT start,NodeT end){

this.start=start;

this.end=end;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值