本文共 2580 字,大约阅读时间需要 8 分钟。
所谓图的遍历,即是对结点的访问。-一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历
图的深度优先遍历介绍
深度优先遍历基本思想:图的深度优先搜素(Depth FirstSearch):DFS
深度优先遍历算法步骤
代码实现:在原先的代码基础上进行添加:
添加变量数组用于记录,在构造方法当中进行初始化。public boolean[] isVisited; // 记录被访问了的节点 public Graph(int n) { edges = new int[n][n]; vertexList = new ArrayList(n); num = 0; isVisited = new boolean[n]; }
添加方法:
// 得到第一个邻接节点的下标 public int getFirstNode(int index) { for (int j = 0; j < vertexList.size(); j++) { if (edges[index][j] > 0) { // 存在下一个节点 return j; } } return -1; } // 根据前一个邻接节点的下标获取下一个邻接节点 public int getNextNode(int v1, int v2) { for (int j = v2 + 1; j < vertexList.size(); j++) { if (edges[v1][j] > 0) { return j; } } return -1; } // 深度优先遍历 private void DFS(boolean[] isVisited, int i) { // 先进行访问i System.out.print(getValue(i) + " -> "); // 把这个节点设置为已访问 isVisited[i] = true; // 查找第一个邻接节点 int w = getFirstNode(i); while (w != -1) { if (!isVisited[w]) { // 节点还未被访问 DFS(isVisited, w); } // 已经被访问,查找下一个邻接 节点 w = getNextNode(i, w); } } // 对DFS进行重载 public void DFS() { // 遍历所有节点进行DFS for (int i = 0; i < nodeNum(); i++) { if (!isVisited[i]) { DFS(isVisited, i); } } }图的广度优先遍历介绍
图的广度优先搜索(Broad First Search)。
类似于-一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访间过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点。广度优先遍历算法步骤
使用代码实现广度优先遍历,添加对应的方法。
// 广度优先遍历 public void BFS(boolean[] isVisited, int i) { int u; // 队列的头节点 int w; // 邻接节点 LinkedList queue = new LinkedList(); // 使用队列记录访问顺序 System.out.print(getValue(i) + " -> "); isVisited[i] = true; queue.addLast(i); while (!queue.isEmpty()) { // 取出队列头节点下标 u = (Integer) queue.removeFirst(); w = getFirstNode(u); while (w != -1) { // 是否被访问过 if (!isVisited[w]) { System.out.print(getValue(w) + " -> "); isVisited[w] = true; // 入队列 queue.addLast(w); } w= getNextNode(u, w); //继续找下一个节点 } } } public void BFS() { // 遍历所有节点进行DFS for (int i = 0; i < nodeNum(); i++) { if (!isVisited[i]) { BFS(isVisited, i); } } }
转载地址:http://ogmzi.baihongyu.com/