图的深度优先遍历 邻接表(边结点存在列表中)

8.3.1深度优先搜索遍历

 

  图的深度优先搜索遍历类似于二叉树的深度优先搜索遍历。其基本思想如下:假定以图中某个顶点Vi为出发点,首先访问出发点,然后选择一个Vi的未访问过的邻接点Vj,以Vj为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。显然,这是一个递归的搜索过程。

 

  现以图8.15为例说明深度优先搜索过程。假定V1是出发点,首先访问V1。因V1有两个邻接点V2、V3均末被访问过,可以选择V2作为新的出发点,访问V2之后,再找V2的末访问过的邻接点。同V2邻接的有V1、V4和V5,其中V1已被访问过,而V4、V5尚未被访问过,可以选择V4作为新的出发点。重复上述搜索过程,继续依次访问V8、V5 。访问V5之后,由于与V5相邻的顶点均已被访问过,搜索退回到V8,访问V8的另一个邻接点V6。接下来依次访问V3和V7,最后得到的的顶点的访问序列为:V1 → V2 → V4 → V8 → V5 → V6 → V3 → V7。

 

package abc.graph;

import java.util.ArrayList;
import java.util.List;

public class AlGraph3 {
	
	List<Node> vertexes = new ArrayList<Node>();
	
	void addVertex(Node vertex) {
		vertexes.add(vertex);
	}
	
	void addArc(Node head, Node tail) {
		head.addArc(tail);
	}
	
	public void DFSTraverse() {
		InitVisited();
		DFS(vertexes.get(0));
	}
	private void DFS(Node node) {
		node.isVisited = true;
		System.out.print(node.name);
		System.out.print(" -> ");
		
		for(Node tmp : node.adjs) {
			if(tmp.isVisited != true)
				DFS(tmp);
		}
	}
	
	private void InitVisited() {
		for(Node node : vertexes) {
			node.isVisited = false;
		}
	}
	
	static AlGraph3 createAlGraph() {
		AlGraph3 alGraph = new AlGraph3();
		
		Node V1 = new Node("V1");
		Node V2 = new Node("V2");
		Node V3 = new Node("V3");
		Node V4 = new Node("V4");
		Node V5 = new Node("V5");
		Node V6 = new Node("V6");
		Node V7 = new Node("V7");
		Node V8 = new Node("V8");
		
		
		alGraph.addVertex(V1);
		alGraph.addVertex(V2);
		alGraph.addVertex(V3);
		alGraph.addVertex(V4);
		alGraph.addVertex(V5);
		alGraph.addVertex(V6);
		alGraph.addVertex(V7);
		alGraph.addVertex(V8);
		
		alGraph.addArc(V1, V2);			alGraph.addArc(V1, V3);
		alGraph.addArc(V2, V1);			alGraph.addArc(V2, V4);	alGraph.addArc(V2, V5);
		alGraph.addArc(V3, V1);			alGraph.addArc(V3, V6);	alGraph.addArc(V3, V7);
		alGraph.addArc(V4, V2);			alGraph.addArc(V4, V8);
		alGraph.addArc(V5, V2);			alGraph.addArc(V5, V8);
		alGraph.addArc(V6, V3);			alGraph.addArc(V6, V8);
		alGraph.addArc(V7, V3);			alGraph.addArc(V7, V8);
		alGraph.addArc(V8, V4);			alGraph.addArc(V8, V5);	alGraph.addArc(V8, V6);	alGraph.addArc(V8, V7);
		
		return alGraph;
	}
	
	void print() {
		for(Node head : vertexes) {
			System.out.print(head.name);
			for(Node arc : head.adjs) {
				System.out.print(" -> ");
				System.out.print(arc.name);
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		AlGraph3.createAlGraph().print();
		System.out.println("\nAlGraph DFSTraverse !!");
		AlGraph3.createAlGraph().DFSTraverse();

	}
}

class Node {
	String name;
	boolean isVisited;
	List<Node> adjs = new ArrayList<Node>();
	
	Node(String name) {
		this.name = name;
	}
	
	void addArc(Node node) {
		adjs.add(node);
	}
}

 

输出结果 写道
V1 -> V2 -> V3
V2 -> V1 -> V4 -> V5
V3 -> V1 -> V6 -> V7
V4 -> V2 -> V8
V5 -> V2 -> V8
V6 -> V3 -> V8
V7 -> V3 -> V8
V8 -> V4 -> V5 -> V6 -> V7

AlGraph DFSTraverse !!
V1 -> V2 -> V4 -> V8 -> V5 -> V6 -> V3 -> V7 ->

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你的问题。以下是用C语言以邻接表方式建立有向,分别利用深度优先遍历和广度优先遍历方法输出各结点元素的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXV 100 // 最大顶点数 typedef struct node { int v; // 邻接点编号 struct node *next; // 指向下一个邻接点的指针 } Node; typedef struct graph { Node *adj[MAXV]; // 邻接表 int n; // 顶点数 } Graph; int visited[MAXV]; // 记录节点是否已被访问 // 创建邻接表 void createGraph(Graph *G, int n) { int i, u, v; Node *p; G->n = n; for (i = 0; i < n; i++) { G->adj[i] = NULL; } printf("请输入边的起点和终点,以-1结束:\n"); while (scanf("%d%d", &u, &v) == 2 && u != -1 && v != -1) { p = (Node *)malloc(sizeof(Node)); p->v = v; p->next = G->adj[u]; G->adj[u] = p; } } // 深度优先遍历 void DFS(Graph *G, int v) { Node *p; visited[v] = 1; printf("%d ", v); for (p = G->adj[v]; p != NULL; p = p->next) { if (!visited[p->v]) { DFS(G, p->v); } } } // 广度优先遍历 void BFS(Graph *G, int v) { int queue[MAXV]; int front = 0, rear = 0; Node *p; visited[v] = 1; printf("%d ", v); queue[rear++] = v; while (front < rear) { v = queue[front++]; for (p = G->adj[v]; p != NULL; p = p->next) { if (!visited[p->v]) { visited[p->v] = 1; printf("%d ", p->v); queue[rear++] = p->v; } } } } int main() { Graph G; int n, v; printf("请输入顶点数:"); scanf("%d", &n); createGraph(&G, n); // 深度优先遍历 printf("深度优先遍历结果:"); for (v = 0; v < G.n; v++) { visited[v] = 0; } for (v = 0; v < G.n; v++) { if (!visited[v]) { DFS(&G, v); } } printf("\n"); // 广度优先遍历 printf("广度优先遍历结果:"); for (v = 0; v < G.n; v++) { visited[v] = 0; } for (v = 0; v < G.n; v++) { if (!visited[v]) { BFS(&G, v); } } printf("\n"); return 0; } ``` 以上代码,`Graph` 结构体,包括邻接表和顶点数;`Node` 结构体邻接表的一个结点,包括邻接点编号和指向下一个邻接点的指针;`visited` 数组记录节点是否已被访问;`createGraph` 函数用于创建;`DFS` 函数用于深度优先遍历;`BFS` 函数用于广度优先遍历。 在 `main` 函数,首先创建了一个 `G`,然后对其进行了深度优先遍历和广度优先遍历。注意,在遍历之前需要将 `visited` 数组初始化为零,以确保每个节点都能被遍历到。遍历的顺序是从顶点0开始依次遍历,如果还有没有被遍历的节点,则从该节点开始继续遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值