public class UnweightedGraph { private final List<String> vertexes = new ArrayList<String>(); private final Map<String, List<String>> linkTable = new TreeMap<String, List<String>>(); public List<String> getVertexes() { return vertexes; } public void addVertexes(String vertex) { if (!this.vertexes.contains(vertex.trim())) { this.vertexes.add(vertex.trim()); } } public void removeVertexes(String vertex) { this.vertexes.remove(vertex.trim()); linkTable.remove(vertex.trim()); for (Map.Entry<String, List<String>> en : this.linkTable.entrySet()) { Iterator<String> iterator = en.getValue().iterator(); while (iterator.hasNext()) { String next = iterator.next(); if (next.trim().equals(vertex)) { iterator.remove(); } } } } public void addEdge(String from, String to) { if (!this.vertexes.contains(from) || !this.vertexes.contains(to)) { return; } List<String> toSet = this.linkTable.get(from); if (toSet == null) { toSet = new ArrayList<>(); this.linkTable.put(from, toSet); } if (!toSet.contains(to)) { toSet.add(to); } } public void addDoubleEdge(String from, String to) { this.addEdge(from, to); this.addEdge(to, from); } public void removeEdge(String from, String to) { if (!this.vertexes.contains(from) || !this.vertexes.contains(to)) { return; } List<String> toSet = this.linkTable.get(from); if (toSet != null) { toSet.remove(to); } } @Override public String toString() { String str = ""; for (Map.Entry<String, List<String>> en : this.linkTable.entrySet()) { str += en.getKey() + " -> [ "; Iterator<String> iterator = en.getValue().iterator(); while (iterator.hasNext()) { String next = iterator.next(); str += next + " "; } str += " ] "; } return "UnweightedGraph{ " + str + '}'; } //深度优先 public List<String> dfs() { if (this.vertexes.isEmpty()) { return Collections.EMPTY_LIST; } List<String> results = new ArrayList<>(); Stack<String> stack = new Stack<>(); String first = this.getVertexes().get(0); results.add(first); stack.push(first); while (!stack.isEmpty()) { String top = stack.peek(); List<String> linkedVertexes = this.linkTable.get(top); String theOne = null; if (linkedVertexes != null) { for (String s : linkedVertexes) { if (!results.contains(s)) { theOne = s; break; } } } if (theOne == null) { stack.pop(); } else { results.add(theOne); stack.push(theOne); } } return results; } //广度优先 public List<String> bfs() { if (this.vertexes.isEmpty()) { return Collections.EMPTY_LIST; } List<String> results = new ArrayList<>(); Queue<String> queue = new LinkedList<>(); String first = this.getVertexes().get(0); results.add(first); queue.add(first); while (!queue.isEmpty()) { String top = queue.peek(); List<String> linkedVertexes = this.linkTable.get(top); String theOne = null; if (linkedVertexes != null) { for (String s : linkedVertexes) { if (!results.contains(s)) { theOne = s; break; } } } if (theOne == null) { queue.poll(); } else { results.add(theOne); queue.add(theOne); } } return results; } public static void main(String[] args) { UnweightedGraph g = new UnweightedGraph(); g.addVertexes("a"); g.addVertexes("b"); g.addVertexes("c"); g.addVertexes("d"); g.addVertexes("e"); g.addDoubleEdge("a", "b"); g.addDoubleEdge("a", "c"); g.addDoubleEdge("b", "e"); g.addDoubleEdge("b", "d"); g.addDoubleEdge("c", "d"); g.addDoubleEdge("d", "e"); System.out.println(g.toString()); List<String> dfs = g.dfs(); System.out.println(dfs.toString()); List<String> bfs = g.bfs(); System.out.println(bfs.toString()); } }