1、开始生成的无向图
2、由图深度优先遍历生成的树
package graph;

import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack;

public class GraphTest {

   public static void main(String[] args) {      AdjacencyMatrixGraph a = new AdjacencyMatrixGraph(6);        a.addVertex("A");       a.addVertex("B");       a.addVertex("C");       a.addVertex("D");       a.addVertex("E");       a.addVertex("F");

      a.addEdge(0, 1);      a.addEdge(1, 2);      a.addEdge(0, 3);      a.addEdge(2, 4);      a.addEdge(0, 2);      a.addEdge(0, 4);      a.addEdge(3, 5);

      a.printMatrix();

      a.traverseDepth();        System.out.println();     a.traverseBroad();

      System.out.println();

      a.growMinTree();      System.out.println();     a.traverseBroad();

//        ConnectionMatrixGraph con = new ConnectionMatrixGraph();//       con.addVertex("A");//       con.addVertex("B");//       con.addVertex("C");//       con.addVertex("D");//       //        con.addEdge(0, 1);//      con.addEdge(0, 3);//      con.addEdge(1, 2);//      con.addEdge(0, 2);//      con.addEdge(2, 3);//      //        con.printConnectionMatrix();

//        con.traverseBroad();  }}

/** * 采用邻接矩阵的无向图 * @author LiangYH * */class AdjacencyMatrixGraph{ //最大顶点数的容量    private int maxSize;  //存放顶点    private List<Vertex> vertexList;    //邻接矩阵,存放点和点的关系    private int[][] adjacencyMatrix;

  public AdjacencyMatrixGraph(int maxSize){     this.maxSize = maxSize;      this.vertexList = new ArrayList<Vertex>();     adjacencyMatrix = new int[maxSize][maxSize]; }

  public boolean isFull(){      return vertexList.size() >= maxSize;  }

  //增加顶点    public void addVertex(String label){      if(isFull())          throw new ArrayIndexOutOfBoundsException("数组已经满了");     vertexList.add(new Vertex(label));    }

  //增加边 public void addEdge(int vertexIndex1, int vertexIndex2){      int size = getSize();        if(vertexIndex1 >= size || vertexIndex2 >= size)          throw new ArrayIndexOutOfBoundsException();

      this.adjacencyMatrix[vertexIndex1][vertexIndex2] = 1;        this.adjacencyMatrix[vertexIndex2][vertexIndex1] = 1;    }

  /**    * 深度优先遍历图     */   public void traverseDepth(){      Stack<Vertex> s = new Stack<>();

      System.out.print(vertexList.get(0).getLabel());       vertexList.get(0).setVisited(true);

      int targetIndex = 0;     while(true){          int size = getSize();            for(int i = 0; i < size; i++){              if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){

                  Vertex temp = vertexList.get(i);                 temp.setVisited(true);

                  System.out.print(vertexList.get(i).getLabel());

                  s.push(vertexList.get(targetIndex));                  targetIndex = i;                 i = 0;               }         }         if(!s.isEmpty()){             Vertex tempV = s.pop();              targetIndex = findVertex(tempV);         }else{                break;            }     }     //恢复      int len = vertexList.size();     for(int i = 0; i < len; i++){           vertexList.get(i).setVisited(false);      } }

  /**    * 广度优先遍历图     */   public void traverseBroad(){      Queue<Vertex> q = new LinkedList<>();        //第一个访问的是第一个顶点        System.out.print(vertexList.get(0).getLabel());       vertexList.get(0).setVisited(true);       //当前所在的节点     int targetIndex = 0;     int size = getSize();        while(true){          for(int i = 0; i < size; i++){              //是否已经被访问过以及是否有边的联系               if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){                   Vertex t = vertexList.get(i);                    q.add(t);                 t.setVisited(true);                   System.out.print(vertexList.get(i).getLabel());               }         }         if(!q.isEmpty()){             //从队列中弹出顶点                Vertex tempV = q.poll();             //改变当前所在的节点下标             targetIndex = findVertex(tempV);         }else{                break;            }     }     //恢复      int len = vertexList.size();     for(int i = 0; i < len; i++){           vertexList.get(i).setVisited(false);      } }

  private int findVertex(Vertex vertex){        for(int i = 0; i < vertexList.size(); i++){         if(vertex == vertexList.get(i))             return i;     }     return -1;    }

  public int getSize(){     return this.vertexList.size();    }

  /**    * 最小生成树   * 思路:和上面的深度优先遍历图的方法基本相同,只是下面的method是在遍历的同时记录下了边的关系。     */   public void growMinTree(){        int len2 = vertexList.size();        int[][] tempDyadic = new int[len2][len2];

      Stack<Vertex> s = new Stack<>();

      System.out.print(vertexList.get(0).getLabel());       vertexList.get(0).setVisited(true);

      int targetIndex = 0;     while(true){          int size = getSize();            for(int i = 0; i < size; i++){              if((!vertexList.get(i).isVisited()) && adjacencyMatrix[targetIndex][i] == 1){                   //最小生成树的邻接矩阵的关键:标记访问过并且有链接的连线,放在新的二维数组中                 tempDyadic[targetIndex][i] = 1;

                  Vertex temp = vertexList.get(i);                 temp.setVisited(true);

                  System.out.print(vertexList.get(i).getLabel());

                  s.push(vertexList.get(targetIndex));                  targetIndex = i;                 i = 0;               }         }         if(!s.isEmpty()){             Vertex tempV = s.pop();              targetIndex = findVertex(tempV);         }else{                break;            }     }     //恢复为都未访问过        int len = vertexList.size();     for(int i = 0; i < len; i++){           vertexList.get(i).setVisited(false);      }     //打印邻接矩阵      System.out.println();     System.out.println("最小生成树的邻接矩阵:");       for(int i = 0; i < len; i++){           for(int k = 0; k < len; k++){               System.out.print(tempDyadic[i][k]+" ");            }         System.out.println();     }     //改变矩阵的引用     adjacencyMatrix = tempDyadic;    }

  public void printMatrix(){        System.out.println("图的邻接矩阵: ");     int len = vertexList.size();     for(int i = 0; i < len; i++){           for(int k = 0; k < len; k++){               System.out.print(adjacencyMatrix[i][k]+" ");           }         System.out.println();     } }}

/** * 采用连接矩阵的无向图 * @author admin * */class ConnectionMatrixGraph{//  private LinkedList<Vertex> vertexList;  private LinkedList<LinkedList<Vertex>> connectionMatrix;

  public ConnectionMatrixGraph(){//     vertexList = new ArrayList<>();        connectionMatrix = new LinkedList<>(); }

  public void addVertex(String label){      LinkedList<Vertex> v = new LinkedList<Vertex>();     v.add(new Vertex(label));     connectionMatrix.add(v);  }

  public void addEdge(int a, int b){        LinkedList<Vertex> vlist1 = this.connectionMatrix.get(a);      LinkedList<Vertex> vlist2 = this.connectionMatrix.get(b);

      vlist1.add(vlist2.get(0));        vlist2.add(vlist1.get(0));    }

  /**    * 打印链接矩阵  */   public void printConnectionMatrix(){      java.util.Iterator<LinkedList<Vertex>> iter = connectionMatrix.iterator();       while(iter.hasNext()){            LinkedList<Vertex> tempLink = iter.next();         java.util.Iterator<Vertex> iter2 = tempLink.iterator();            while(iter2.hasNext()){               Vertex v = iter2.next();             System.out.print(v.getLabel()+"-->");           }         System.out.println();     } }

  /**    * 图的广度优先遍历,不需栈     */   public void traverseBroad(){      Iterator<LinkedList<Vertex>> iter = null;        iter = connectionMatrix.iterator();      while(iter.hasNext()){            LinkedList<Vertex> tempLink = iter.next();         Iterator<Vertex> iter2 = null;         iter2 = tempLink.iterator();

          Vertex tempV2 = null;            if(iter2.hasNext()){              tempV2 = iter2.next();               //如果没有访问过             if(!tempV2.isVisited()){                  tempV2.setVisited(true);                  System.out.print(tempV2.getLabel());              }         }else{                continue;         }         while(iter2.hasNext()){               Vertex tempV = iter2.next();             if(!tempV.isVisited()){                   tempV.setVisited(true);                   System.out.print(tempV.getLabel());               }         }     } }

}

/** * 顶点 * @author admin * */class Vertex{  private String label; private boolean isVisited;

  public Vertex(String label){      this.label = label;      this.isVisited = false;  }

   public String getLabel() {        return label; }

   public void setLabel(String label) {      this.label = label;  }

   public boolean isVisited() {      return isVisited; }

   public void setVisited(boolean isVisited) {       this.isVisited = isVisited;  }

}
结果:

无向图--邻接矩阵、连接矩阵、深度遍历、广度遍历、生成树相关推荐

  1. 数据结构【图】—022邻接矩阵的深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 typedef char VertexType; /* 顶点类型应由用户定义 */ 5 typedef int ...

  2. 数据结构 - 图的基本操作 深度和广度遍历

    ##代码实现 ###main.cpp(主函数) #include <iostream> #include "CMap.h" using namespace std;/* ...

  3. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  4. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  5. 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现

    一. 树与树算法 1.1树的概念   树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  6. 有向图的深度和广度遍历

    题目要求: 1.对于下图所示的有向图(访问顺序按序号从小到大),试写出: (1) 从顶点①出发进行深度优先搜索所得到的深度优先生成树: (2) 从顶点②出发进行广度优先搜索所得到的广度优先生成树. p ...

  7. 图 邻接表 建立 深度遍历 广度遍历

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...

  8. js实现深度遍历与广度遍历

    题目:省份数量 有 n 个城市,其中一些彼此相连,另一些没有相连.如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连. 省份 是一组直接或间接相连 ...

  9. js中树形结构的深度遍历与广度遍历

    树形结构的深度遍历与广度遍历 定义 深度遍历:一个树形结构中,由一个数据分支全部遍历完才去遍历另外一个分支,直至全部数据遍历完成. 广度遍历:先遍历最外层的分支数据,然后一层一层的进行深入遍历,直至全 ...

最新文章

  1. C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数
  2. [BZOJ 4800][Ceoi2015]Ice Hockey World Championship(Meet-in-the-Middle)
  3. Chrome浏览器不支持字体小于12px的解决办法
  4. [architecture]-ARMV8的RAS Extension(Reliability、Availability、Serviceability)介绍
  5. TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成
  6. pd 生成mysql语句_PDMan + Navicat Premium + MySQL 数据库设计和工具
  7. mysql复制功能介绍
  8. java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》
  9. html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件
  10. Android中文API-ViewStub
  11. 超有用的方法-----英语单词记忆篇
  12. extract 模板 php,PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例...
  13. python 基础学习--运算符集合
  14. linux下安装svn1.7
  15. 2021年中国电动扫地机市场趋势报告、技术动态创新及2027年市场预测
  16. 基于java在线问卷调查系统
  17. layabox 学习笔记
  18. python爬取豆瓣Top250-改进版
  19. java libmp3lame_利用libmp3lame实现在Android上录音MP3文件示例
  20. Python 贪心法:真分数表示为埃及分数之和

热门文章

  1. 【物联网智能网关-14】Html5:Canvas+WebSocket实现远程实时通信(下)
  2. C# EF 基础操作
  3. Html5 Json应用
  4. MYSQL主从数据库搭建
  5. cocos2d-x 3.0 Loading界面实现
  6. Python实现线程池
  7. C语言库函数大全及应用实例二
  8. gcc编译器和mysql源码哪个难_源码编译mysql 5.5
  9. python元素定位的八种方法_selenium webdriver基于Python系列之八种元素定位方法
  10. 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)