图的创建以及遍历
用链表实现图结构,上代码:
public class GraphLink { public Node first; public Node last; public boolean isEmpty() { return first == null; } public void print() { Node current = first; while (current != null) { System.out.print("[" + current.x + "]"); current = current.next; } System.out.println(); } public void insert(int x) { Node newNode = new Node(x); if (this.isEmpty()) { first = newNode; last = newNode; } else { last.next = newNode; last = newNode; } } } class Node { int x; Node next; public Node(int x) { this.x = x; this.next = null; } }
图的遍历方式有两种:先深后广,先广后深。
这里很巧妙的运用了栈和队列这两种数据结构,栈是先进后出,队列是先进先出。
先深后广,用的是栈;
先广后深,用的是队列;
也可以叫:深度优先搜索DFS(Deep First Search)、广度优先搜索BFS(Breath First Search)。
下面我举个例子:
比如有如下一个图:

先深后广法:
步骤01:以顶点1为起点,将相邻的顶点2和顶点5压入堆栈。
⑤|②
步骤02:弹出顶点2,将与顶点2相邻且未访问过的顶点3和顶点4压入堆栈。
⑤|④|③
步骤03:弹出顶点3,将与顶点3相邻且未访问过的顶点4和顶点5压入堆栈。
⑤④|⑤|④
步骤04:弹出顶点4,将与顶点4相邻且未访问过的顶点5压入堆栈。
⑤④|⑤|⑤
步骤05:弹出顶点5,将与顶点5相邻且未访问过的顶点压入堆栈,大家可以发现与顶点5相邻的顶点全部被访问过了,所以无须再压入堆栈。
⑤|④|⑤
步嘘06:将堆栈内的值弹出并判断是否已经遍历过了,直到堆栈内无节点可遍历为止。
深度优先的遍历顺序为顶点1、顶点2、顶点3、顶点4、顶点5。
先广后深法:
步骤01:以顶点1为起点,将与顶点1相邻且未访问过的顶点2和顶点5加入队列。
②|⑤
步骤02:取出顶点2,将与顶点2相邻且未访问过的顶点3和顶点4加入队列。
⑤|③|④
步骤03:取出顶点5,将与顶点5相邻且未访问过的顶点3和顶点4加入队列。
③④|③|④
步骤04:取出顶点3,将与顶点3相邻且未访问过的顶点4加入队列。
④③|③|④
步骤05:取出顶点4,将与顶点4相邻且未访问过的顶点加入队列中,大家可以发现与顶点4相邻的顶点全部被访问过了,所以无须再加入队列中。
③④②④
步骤06:将队列内的值取出并判断是否已经遍历过了,直到队列内无节点可遍历为止。
广度优先的遍历顺序为顶点1、顶点2、顶点5、顶点3、顶点4。

浙公网安备 33010602011771号