Algorithm 学习构建基本的图数据结构
关于图的基础知识点目前掌握地不深入,只总结了这些内容:
网络异常,图片无法展示
|
下边来看代码
邻接矩阵:
package 图.邻接矩阵; /** * @author idea * @data 2019/8/25 */ public class Graph { /** * 二维矩阵 */ public int[][] graph; /** * 矩阵里面的点集合 A,B,C,D,E,F,G */ public String[] nodeArr; private int height; private int width; public void init(String[] nodeArr){ this.nodeArr=nodeArr; int total=nodeArr.length; init(total,total); } /** * 初始化图的长和宽 * * @param height * @param width */ private void init(int height, int width) { graph = new int[height][width]; this.height = height; this.width = width; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { graph[i][j] = 0; } } } /** * 打印出图的内部结构 */ public void displayGraph() { System.out.println("图的高度:" + height + " 图的宽度:" + width); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { System.out.print(graph[i][j]+" "); } System.out.println(""); } } /** * 添加矩阵元素 */ public void insertItem(String vert) { String[] verts=vert.split(","); if(verts.length==2){ String xStr=verts[0]; String yStr=verts[1]; if(xStr.equals(yStr)){ return; } int x=0,y=0; for(int i=0;i<nodeArr.length;i++){ if(nodeArr[i].equals(xStr)){ x=i; } if(nodeArr[i].equals(yStr)){ y=i; } } graph[x][y]=1; graph[y][x]=1; } } public static void main(String[] args) { Graph g=new Graph(); g.init(new String[]{"A"}); g.displayGraph(); g.insertItem("A,B"); g.insertItem("B,C"); g.insertItem("C,D"); g.insertItem("D,E"); g.displayGraph(); } } 复制代码
构建邻接表
package 图.邻接表; /** * @author idea * @data 2019/8/25 */ public class ElementNode { private String value; private ElementNode next; public ElementNode(String value, ElementNode next) { this.value = value; this.next = next; } public String getValue() { return value; } public ElementNode setValue(String value) { this.value = value; return this; } public ElementNode getNext() { return next; } public ElementNode setNext(ElementNode next) { this.next = next; return this; } } package 图.邻接表; import java.util.HashMap; /** * @author idea * @data 2019/8/25 */ public class Graph { /** * 邻接表元素集合 */ private ElementNode[] elementNodes; private int size; /** * 初始化图结构 添加定点的操作 */ public void initGraph(String[] vertsArr){ size = vertsArr.length; elementNodes=new ElementNode[size]; for(int i=0;i<size;i++){ elementNodes[i]=new ElementNode(vertsArr[i],null); } } /** * 添加边 */ public void insertEdege(String edege){ ElementNode elementNode=new ElementNode(edege,null); String[] arr = edege.split(","); if(arr.length==2){ String from=arr[0],to=arr[1]; ElementNode fromNode=getElementNode(from); ElementNode nextNode =fromNode.getNext(); ElementNode newNode=new ElementNode(to,null); if(nextNode==null){ fromNode.setNext(newNode); return ; } while(nextNode.getNext()!=null){ nextNode=nextNode.getNext(); } nextNode.setNext(newNode); } } /** * 获取点 * * @param value * @return */ private ElementNode getElementNode(String value){ for(int i=0;i<size;i++){ if(elementNodes[i].getValue().equals(value)){ return elementNodes[i]; } } return null; } public void display(){ for(int i=0;i<size;i++){ ElementNode elementNode=elementNodes[i]; if(elementNode.getNext()==null){ System.out.print(elementNode.getValue()+"->null"+"\n"); continue; } while(elementNode!=null && elementNode.getNext()!=null){ System.out.print(elementNode.getValue()+"->"); elementNode=elementNode.getNext(); } System.out.print(elementNode.getValue()+"\n"); } } public static void main(String[] args) { Graph g=new Graph(); g.initGraph(new String[]{"A","B","C","D","E","F"}); g.display(); g.insertEdege("A,B"); g.insertEdege("C,A"); g.insertEdege("A,D"); g.insertEdege("E,B"); g.insertEdege("D,E"); g.insertEdege("D,F"); g.insertEdege("F,C"); g.display(); } }