java实现图的深度优先遍历和广度优先遍

       首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕;如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先遍历就类似于树的层序遍历了,即一层一层的去遍历节点,直至所有节点都被访问完毕。

  不多说,直接上代码,会对部分代码添加说明。

import java.util.*;
public class Traverse{
  public static void main(String[] args){
     //接受输入,比如int类型,节点Node存储各个图节点;Path存储各个节点作为开始的路径
     Traverse tr = new Traverse();     
     System.out.print("深度优先遍历是:");
     ArrayList<Node>visited = new ArrayList<>();
     visited.add(a);
     tr.depthFirstSearch(a);
     System.out.print("广度优先遍历是:");
     tr.wudthSearch(a);
     }
  public void depthFirstSearch(Node a,List<Node> visited){
     for(int i=0;i<a.out.size();i++){
        Node cur = a.out.get(i).end;
              //打印当前结点
        System.out.println(cur.node);
        if(!visited.contains(cur)){
          visited.add(cur);
          depthFirstSearch(cur,visited);
        }
     }
  }
   public void widthSearch(Node a){
     Set<Node> visited = new HashSet<>();
       Queue<Node> q = LinkedList<>();
       q.offer(a);
      while(!q.isEmpty()){
        Node cur = q.poll();
        //检查是否已访问该节点,避免重复访问
        if(!visited.contains(cur)){
          visited.add(cur);
               //打印当前结点
               System.out.println(cur.node);
        }
        for(int i =0;i<a.out.size();i++){
           q.offer(a.out.get(i).end);
        }
   }
  }
}
    //节点
    class Node{
      int node;
      ArrayList<Path>out;
      public Node(int node){
        //初始化
        this.node = node ;
        out = new ArrayList<>()
      }
   }
    //路径
    class Path{
      Node start;
      Node end;
      public Path(Node start,Node end){
         this.start=start;
         this.end=end;
      }
  }

      

 

posted @ 2017-08-31 15:24  卑微的蜗牛  阅读(606)  评论(0编辑  收藏  举报