java图的遍历方式(深度遍历、广度遍历)

[java]  view plain copy
  1. import java.util.*;  
  2.   
  3. /** 
  4.   *  这个例子是图的遍历的两种方式 
  5.   *  通过它,使我来理解图的遍历  
  6.   *  Created on 2013-11-18 
  7.   *  @version 0.1 
  8.   */  
  9. public class DeptSearch  
  10. {  
  11.     public static void main(String args[]){  
  12.         //构造需要点对象  
  13.         NodeT a=new NodeT("a");  
  14.         NodeT b=new NodeT("b");  
  15.         NodeT c=new NodeT("c");  
  16.         NodeT d=new NodeT("d");  
  17.         NodeT e=new NodeT("e");  
  18.         NodeT f=new NodeT("f");  
  19.         NodeT g=new NodeT("g");  
  20.         NodeT h=new NodeT("h");  
  21.         ArcT ab=new ArcT(a,b);  
  22.         ArcT ac=new ArcT(a,c);  
  23.         ArcT ad=new ArcT(a,d);  
  24.         ArcT ah=new ArcT(a,h);  
  25.         ArcT bc=new ArcT(b,c);  
  26.         ArcT de=new ArcT(d,e);  
  27.         ArcT ef=new ArcT(e,f);  
  28.         ArcT eg=new ArcT(e,g);  
  29.         ArcT hg=new ArcT(h,g);  
  30.   
  31.         //建立它们的关系  
  32.         a.outgoing.add(ab);  
  33.         a.outgoing.add(ac);  
  34.         a.outgoing.add(ad);  
  35.         a.outgoing.add(ah);  
  36.         b.outgoing.add(bc);  
  37.         d.outgoing.add(de);  
  38.         e.outgoing.add(ef);  
  39.         e.outgoing.add(eg);  
  40.         h.outgoing.add(hg);  
  41.   
  42.         //构造本对象  
  43.         DeptSearch search=new DeptSearch();  
  44.           
  45.         //广度遍历  
  46.         System.out.println("广度遍历如下:");  
  47.         search.widthSearch(a);  
  48.   
  49.         //深度遍历  
  50.         System.out.println("深度遍历如下:");  
  51.         List<NodeT> visited=new ArrayList<NodeT>();  
  52.         search.deptFisrtSearch(a,visited);  
  53.           
  54.     }  
  55.       
  56.     /* 
  57.      * 深度排序的方法 
  58.      * 这个方法的方式:按一个节点,一直深入的找下去,直到它没有节点为止 
  59.      * cur  当前的元素 
  60.      * visited 访问过的元素的集合 
  61.      */  
  62.     void deptFisrtSearch(NodeT cur,List<NodeT> visited){  
  63.         //被访问过了,就不访问,防止死循环  
  64.         if(visited.contains(cur)) return;  
  65.         visited.add(cur);  
  66.         System.out.println("这个遍历的是:"+cur.word);  
  67.         for(int i=0;i<cur.outgoing.size();i++){  
  68.             //访问本点的结束点  
  69.             deptFisrtSearch(cur.outgoing.get(i).end,visited);  
  70.         }  
  71.     }  
  72.   
  73.     /** 
  74.      * 广度排序的方法 
  75.      * 这个方法的方式:按层次对图进行访问,先第一层,再第二层,依次类推 
  76.      * @param start 从哪个开始广度排序 
  77.      */  
  78.     void widthSearch(NodeT start){  
  79.         //记录所有访问过的元素  
  80.         Set<NodeT> visited=new HashSet<NodeT>();  
  81.         //用队列存放所有依次要访问元素  
  82.         Queue<NodeT> q=new LinkedList<NodeT>();  
  83.         //把当前的元素加入到队列尾  
  84.         q.offer(start);  
  85.           
  86.         while(!q.isEmpty()){  
  87.             NodeT cur=q.poll();  
  88.             //被访问过了,就不访问,防止死循环  
  89.             if(!visited.contains(cur)){  
  90.                 visited.add(cur);  
  91.                 System.out.println("查找的节点是:"+cur.word);  
  92.                 for(int i=0;i<cur.outgoing.size();i++){  
  93.                     //把它的下一层,加入到队列中  
  94.                     q.offer(cur.outgoing.get(i).end);  
  95.                 }  
  96.             }  
  97.         }  
  98.     }  
  99.   
  100. }  
  101.   
  102. /** 
  103.   * 图的点 
  104.   */  
  105. class NodeT  
  106. {  
  107.     /* 点的所有关系的集合 */  
  108.     List<ArcT> outgoing;  
  109.     //点的字母  
  110.     String word;  
  111.     public NodeT(String word){  
  112.         this.word=word;  
  113.         outgoing=new ArrayList<ArcT>();  
  114.     }  
  115. }  
  116.   
  117. /** 
  118.   * 单个图点的关系 
  119.   */  
  120. class ArcT  
  121. {  
  122.     NodeT start,end;/* 开始点,结束点 */  
  123.     public ArcT(NodeT start,NodeT end){  
  124.         this.start=start;  
  125.         this.end=end;  
  126.     }  
  127. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先遍历广度优先遍历的两种常见遍历算法。 深度优先遍历(DFS)是一种递归算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,再依次对每个邻接节点进行深度优先遍历。换句话说,DFS会沿着的一条路径一直往下遍历,直到遇到没有未访问过的邻接节点为止,再返回上一级节点继续遍历其他未访问过的节点。DFS的实现一般使用递归或栈来保存待访问节点。 广度优先遍历(BFS)是一种队列的算法,它从中的某个节点开始,首先访问该节点,然后遍历该节点的所有邻接节点,并将这些邻接节点加入队列中。接下来从队列中取出一个节点,再依次遍历该节点的邻接节点,并将未访问过的邻接节点加入队列中,如此往复直到队列为空。BFS的实现一般使用队列来保存待访问节点。 在视频中,可以演示通过的邻接矩阵或邻接表的形式来表示,并使用Java代码来实现深度优先遍历广度优先遍历。对于深度优先遍历,可以从中的某个节点开始递归地遍历它的邻接节点,并使用一个标记数组来记录节点是否已经访问过。对于广度优先遍历,可以使用一个队列来按照广度优先的顺序遍历中的节点,并同样使用标记数组来记录节点是否已经访问过。 通过这个视频,观众可以了解到深度优先遍历广度优先遍历的原理和实现方法,并通过代码示例更好地理解其过程。这些算法在遍历、路径查找等问题中应用广泛,对于理解和解决相关问题具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值