DFS与BFS代码实现

利用如图用DFS与BFS来遍历 

 

package leetcode;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * @author 江河
 * @date 2019-09-11 15:15
 */
public class Graph {
  private int number = 6;
  private boolean[] flag;
  private String[] vertexs = { "0", "1", "2", "3", "4", "5"};
  private int[][] edges = {
      { 0, 1, 1, 0, 0, 1},
      { 1, 0, 1, 0, 0, 0},
      { 1, 1, 0, 1, 1, 0},
      { 0, 0, 1, 0, 0, 1},
      { 0, 0, 1, 1, 0, 0},
      { 1, 0, 0, 1, 0, 0}
  };

  void DFSTraverse() {
    flag = new boolean[number];
    for (int i = 0; i < number; i++) {
      if (flag[i] == false) {
        // 当前顶点没有被访问,调用dfs
        DFS(i);
      }
    }
  }
  //递归访问DFS
  void DFS(int i) {
    flag[i] = true;// 第i个顶点被访问,并输出这个点
    System.out.print(vertexs[i] + " ");
    for (int j = 0; j < number; j++) {
      //控制没被访问的点,如果这个点关联的的点没被访问false,且有关联递归下去这点
      if (flag[j] == false && edges[i][j] == 1) {
        DFS(j);
      }
    }
  }
//非递归访问利用栈
  void DFS_Map(){
    flag = new boolean[number];
    Stack<Integer> stack =new Stack<Integer>();
    for(int i=0;i<number;i++){
       //这个点没被访问,输出并置为true存入栈,遍历与起相关的点
      if(flag[i]==false){
        flag[i]=true;
        System.out.print(vertexs[i]+" ");
        stack.push(i);
      }
      //利用栈来控制没被访问的点且有关联的
      while(!stack.isEmpty()){
        int k = stack.pop();
        for(int j=0;j<number;j++){
          if(edges[k][j]==1&&flag[j]==false){
            flag[j]=true;
            System.out.print(vertexs[j]+" ");
            stack.push(j);
            break;
          }
        }

      }
    }
  }
  //广度搜索利用队列
  void BFS_Map(){
    flag = new boolean[number];
    Queue<Integer> queue = new LinkedList<Integer>();
    for(int i=0;i<number;i++){
      //没被访问的点并存取队列,
      if(flag[i]==false){
        flag[i]=true;
        System.out.print(vertexs[i]+" ");
        queue.add(i);
         //利用队列特性来关联相关的且没被访问的点
        while(!queue.isEmpty()){
          int k=queue.poll();
          for(int j=0;j<number;j++){
            if(edges[k][j]==1&&flag[j]==false){
              flag[j] = true;
              System.out.print(vertexs[j]+" ");
              queue.add(j);
            }
          }
        }
      }
    }
  }

  public static void main(String[] args) {
    Graph graph = new Graph();
    System.out.println("DFS递归:");
    graph.DFSTraverse();
    System.out.println();
    System.out.println("DFS非递归:");
    graph.DFS_Map();
    System.out.println();
    System.out.println("BFS非递归:");
    graph.BFS_Map();
  }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值