zoukankan      html  css  js  c++  java
  • 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;
          }
      }
    
          
  • 相关阅读:
    实习第一天
    使用epublib解析epub文件(章节内容、书籍菜单)
    jdk1.8以前不建议使用其自带的Base64来加解密
    java学习-AES加解密之AES-128-CBC算法
    java学习-sha1散列算法
    日、周、月活跃用户数,用户流失率
    java学习-java.lang.Math随机数生成
    AndroidStudio报错Software caused connection abort: recv failed
    java学习-java.lang一Number类
    jdk内置类javax.imageio.ImageIO支持的图片处理格式
  • 原文地址:https://www.cnblogs.com/zy230530/p/7458465.html
Copyright © 2011-2022 走看看