图的两种遍历

图是一种非线性数据结构,图的存储有两种方式,邻接矩阵和邻接表。
邻接矩阵存储方法的缺点是比较浪费空间,但是优点是查询效率高,而且方便矩阵运算。
邻接表存储方法中每个顶点都对应一个链表,存储与其相连接的其他顶点。尽管邻接表的存储方式比较节省存储空间,但链表不方便查找,所以查询效率没有邻接矩阵存储方式高。针对这个问题,邻接表还有改进升级版,即将链表换成更加高效的动态数据结构,比如平衡二叉查找树、跳表、散列表等。

图的搜索方式有两种深度优先和广度优先

广度优先搜索
图的两种遍历_第1张图片
深度优先搜索
图的两种遍历_第2张图片

public class Graph {
	private int v;//顶点个数
	private LinkedList[] adj;//邻接表
	
	public Graph(int v){
		this.v = v;
		adj = new LinkedList[v];
		for(int i=0;i();
		}
	}
	
	public void addEdge(int s,int t) {
		adj[s].add(t);
		adj[t].add(s);
	}
	
	/**
	 * 广度优先搜索:最短路径
	 * 它其实就是一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。
	 * @param s 起始点
	 * @param t 终止点
	 * 时间复杂度:O(E),E表示图的边数
	 * 空间复杂度:O(V),V表示图的顶点数
	 */
	public void bfs(int s,int t) {
		if(s==t) return;
		
		boolean[] visited = new boolean[v];
		Queue queue = new LinkedList<>();
		int[] prev = new int[v];
		for(int i=0;i queue = new LinkedList<>();
		int[] prev = new int[v];
		for(int i=0;i= 4) {
						return;
					}
					visited[q] = true;
					queue.add(adj[w].get(i));
				}
			}
		}
	}
	
	private void print(int[] prev,int s,int t) {
		if(t != s && prev[t] != -1) {
			print(prev,s,prev[t]);
		}
		System.out.print(t+"->");
	}
	
	private boolean found = false;
	/**
	 * 深度优先搜索
	 * 最直观的例子就是“走迷宫”。假设你站在迷宫的某个岔路口,然后想找到出口。你随意选择一个岔路口来走,走着走着发现走不
	 * 通的时候,你就回退到上一个岔路口,重新选择一条路继续走,直到最终找到出口。这种方法就是一种深度优先搜索策略。
	 * @param s
	 * @param t
	 * 时间复杂度:O(E)
	 * 空间复杂度:O(V)
	 */
	public void dfs(int s,int t) {
		boolean[] visited = new boolean[v];
		int[] prev = new int[v];
		for(int i=0;i

测试搜索

public class TestGraph {
	public static void main(String[] args) {
		Graph graph = new Graph(8);
		graph.addEdge(0, 1);
		graph.addEdge(0, 3);
		graph.addEdge(1, 2);
		graph.addEdge(1, 4);
		graph.addEdge(3, 4);
		graph.addEdge(4, 5);
		graph.addEdge(4, 6);
		graph.addEdge(5, 7);
		graph.addEdge(6, 7);
		
		//graph.bfs(0, 6);
		//graph.dfs(0, 6);
		graph.bfs_3(0, 3);
		System.out.println("---------------");
		graph.dfs(0, 3);
	}
}

执行结果

0->1->4->5->
0->1->4->6->
---------------
0->1->4->3->

你可能感兴趣的:(数据结构与算法,数据结构)