Java数据结构:图的深度优先遍历和广度优先遍历

更新啦,更新啦。

图的深度优先遍历:通过一个结点开始遍历,直到遍历到该结点没有下一个结点为止,然后开始递归下一个结点,如果被访问过,则跳过遍历,依次类推。类似于一口气到底,如果没到底,则换个结点继续到底。如果被访问过的结点则不需要遍历。

过程:A开始进入递归,A先打印。然后发现A的下一个结点为B,C,D。此时按照顺序开始,B不为空,B进入递归,打印B,然后发现B的下一个结点为A,C,E。由于A已被访问,此时按顺序得到结点C,然后C进入递归,打印D,E。然后D进入递归,打印D,然后E,F依次进入递归。。。。。顺序为:ABCDEF。

上代码:

public void DFSTraverse(int i) {
		boolean[] visited = new boolean[this.vertexCount()];
		int j = i;
		do { // 使每个结点进入递归
			if (!visited[j]) { // 用于标记是否被访问
				System.out.println("{"); // 打印外边
				this.depthfs(j, visited); // 进入递归
				System.out.println("}");
			}
			j = (j + 1) % this.vertexCount();
		} while (j != i);
		System.out.println();
	}

	private void depthfs(int i, boolean[] visited) { // 递归开始
		System.out.println(this.getVertex(i) + " "); // 打印结点值
		visited[i] = true; // 设置访问过
		int j = this.next(i, -1); // 找到当前结点的下一个结点,顺序优先
		while (j != -1) { // 如果存在,不存在为-1
			if (!visited[j]) { // 并且没有被访问过
				depthfs(j, visited); // 再次进入递归
			}
			j = this.next(i, j); // 出现了递归终止,发现该 结点没有下一结点,则在最开始的递归结点后,找下一节点
		}
	}

图的广度优先遍历:与上面不同,利用队列储存每个结点的下一结点(所有)。然后入队,打印完当前结点后再出队,进行下次递归。类似于,一下子遍历当前结点的所有下一节点。然后一层一层进行。

过程:从A开始,然后while循环找A的所有子结点,发现了BCD。然后入队此时队列中为BCD,打印出来A结点。然后进入A进入的递归,出队B代替A,在递归中执行,发现C,E此时由于C已在度列中,则不需要入队,此时只需要E入队,此时队列中为CDE。类似执行D,队列中为EF。。。。然后直到所有被访问完。同理遇到结点无子结点,则递归结束,返回到之前进入递归之前的结点,改变为下一节点。。。。再次递归。

上代码

	public void BFSTraverse(int i) {
		boolean[] visited = new boolean[this.vertexCount()]; // 用于标志是否被访问
		int j = i;// 获得结点
		do {
			if (!visited[j]) {
				System.out.println("{"); // 打印外边
				breadthfs(j, visited); // 进入打印递归
				System.out.println("}");
			}
			j = (j + 1) % this.vertexCount();
		} while (j != i);// 直到循环一圈
		System.out.println();
	}

	private void breadthfs(int i, boolean[] visited) { // 循环
		System.out.println(this.getVertex(i) + " "); // 打印结点
		visited[i] = true; // 设置访问过
		LinkedQueue<Integer> que = new LinkedQueue<Integer>(); // 建立链队
		que.add(i); // 将当前结点入队
		while (!que.isEmpty()) { // 如果队列不空,无限循环
			i = que.poll(); // 出队
			for (int j = next(i, -1); j != i; j = next(i, j)) {// 循环,获得i的所有子结点
				if (!visited[j]) { // 如果没被访问
					System.out.println(this.getVertex(i) + " "); // 输出结点
					visited[j] = true; // 设置为访问过
					que.add(j); // 结点入队
				}
			}
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_42192693/article/details/84860742